E07380: return not possible, as instructions only result in an Exception
What went wrong
A function, method or dynamic function declares a returning value ('<- rtn ...'), but every path through its body throws an exception, so the value can never be returned. (EK9 has no 'return' statement: the returning variable is the result.)
Worked examples
Compilable examples demonstrating this error and the correct fix:
- ek9 -q 1318 (Why does EK9 say a return is not possible when all bra...)
How to fix it
- If nothing is ever returned, remove the returning declaration (a dynamic function then needs a super that returns nothing, such as Consumer)
- Or add a path that does not throw and gives the returning variable a value
The [EXAMPLE] section below shows dynamic functions whose every path throws, and one where a branch gives the result a value.
Common causes
- A returning declaration left after refactoring
- Misunderstanding control flow
- A dynamic function whose super returns a value (e.g. 'is Supplier of String') has a body that can only throw - there is no path that returns. A super that returns nothing (e.g. Consumer) may only throw.
See also
Examples
Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.
Fails with E07380: return not possible, as instructions only result in an Exception
#!ek9 defines module error.e07380.bad defines function blockBodyOnlyThrows() <- rtn as Boolean? supplier <- () is Supplier of String as pure function throw Exception("always") rtn: supplier? singleStatementBodyOnlyThrows() <- rtn as Boolean? supplier <- () is Supplier of String as pure function (throw Exception("always")) rtn: supplier? everyBranchThrows() <- rtn as Boolean? describer <- () is Function of (Integer, String) as pure function if t > 0 throw Exception("positive") else throw Exception("not positive") rtn: describer? oneBranchReturnsIsFine() <- rtn as Boolean? describer <- () is Function of (Integer, String) as pure function if t > 0 throw Exception("positive") else r: "not positive" rtn: describer? voidSuperMayOnlyThrow() <- rtn as Boolean? consumer <- () is Consumer of String as pure function throw Exception("always") rtn: consumer?
Fixed: Give at least one path a value to return
#!ek9 defines module error.e07380.good defines program Describe() stdout <- Stdout() //One branch gives the result a value, so it can be returned describer <- () is Function of (Integer, String) as pure function if t > 0 throw Exception("positive") else r: "not positive" stdout.println(describer(0))
Questions and answers
These Q&A entries show E07380 and its fix: