E04030: type must be of Exception type

Category: E04xxx Reference checks · Reported in phase: FULL_RESOLUTION · Classification: TYPE_MUST_EXTEND_EXCEPTION · All error codes

What went wrong

Only types that extend Exception can be used with throw/catch. You're trying to throw or catch a type that isn't an exception.

Worked examples

Compilable examples demonstrating this error and the correct fix:

  • ek9 -q 136 (How do I throw exceptions in EK9?)
  • ek9 -q 134 (How do I use try/catch to handle exceptions in EK9?)
  • ek9 -q 138 (How do I catch specific exception types in EK9?)
  • ek9 -q 135 (How does try/catch/finally work in EK9?)
  • ek9 -q 305 (What is the difference between require, assert, and throw?)
  • ek9 -q 1434 (What is a Panic in EK9 and when does the language raise one?)

[BUILT-IN EXCEPTIONS]

  • Exception (base type)
  • Various system exceptions for I/O, parsing, etc.

Panic is not an exception

Panic is raised only by the language (a failed require, a constrained-type value out of range, an unset for-range bound). It is not an Exception, so 'catch -> ex as Panic' is this error. User code cannot create a Panic at all: 'Panic(...)', and so 'throw Panic(...)', is E50060. A Panic always ends the program with exit status 1. To end with a status you choose, throw an Exception carrying it, Exception("Settings missing", 3), and do not catch it.

How to fix it

  • Add 'extends Exception' to your error type
  • Or use a built-in exception type

Common causes

  • Forgetting 'extends Exception' on custom error type
  • Using a record or enum where exception needed
  • Typo causing wrong type to be thrown
  • Throwing or catching Panic, which only the language raises
  • Throwing a message String (ex.reason()) instead of the exception itself

See also

  • E07850: only a single Exception per catch block

Examples

Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.

Fails with E04030: type must be of Exception type

#!ek9
defines module error.e04030.bad

  defines function

    validated()
      -> amount as Integer
      <- rtn as Integer: amount
      if amount < 0
        throw String("The amount cannot be negative")

Fixed: Throw an Exception (or a type that extends it), carrying the message

#!ek9
defines module error.e04030.good

  defines function

    validated()
      -> amount as Integer
      <- rtn as Integer: amount
      if amount < 0
        throw Exception("The amount cannot be negative")

Questions and answers

These Q&A entries show E04030 and its fix: