gleam/docs/runtime-errors.md
Louis Pilfold f6a8d761d8 New format
2025-05-27 17:26:04 +01:00

7.3 KiB

Runtime errors

There are several runtime errors that Gleam code can throw. This documentation lists them and their runtime properties.

On Erlang runtime errors are Erlang maps thrown with erlang:error/1, having at least these properties:

Key Type Value
gleam_error Atom See individual errors
message String See individual errors
file String A path to the original source file location
module String The module the error occurred in
function String The function the error occurred in
line Int The line number the error occurred on

On JavaScript runtime errors are instances of the JavaScript Error class, having at least these properties added to them:

Key Type Value
gleam_error String See individual errors
message String See individual errors
module String The module the error occurred in
function String The function the error occurred in
line Number The line number the error occurred on

Todo

A panic that indicates that the code has not yet been completed, intended for use in development.

todo
todo as "some message"
Key Erlang Value JavaScript Value
gleam_error todo "todo"
message The given message The given message

Panic

An explicit panic to unconditionally error.

panic
panic as "some message"
Key Erlang Value JavaScript Value
gleam_error panic "panic"
message The given message The given message

Let assert

An inexhaustive pattern match, erroring if the pattern does not match.

let assert Ok(x) = something()
let assert Error(e) = something() as "This should fail"
Key Erlang Value JavaScript Value
gleam_error let_assert "let_assert"
message The given message The given message
value The unmatched value The unmatched value
start The byte-index of the start of the let assert statement The byte-index of the start of the let assert statement
end The byte-index of the end of the let assert statement The byte-index of the end of the let assert statement
pattern_start The byte-index of the start of the asserted pattern The byte-index of the start of the asserted pattern
pattern_end The byte-index of the end of the asserted pattern The byte-index of the end of the asserted pattern

Assert

An assertion of a boolean value.

The error format of assert differs based on the expression that is asserted. It always has these fields:

Key Erlang Value JavaScript Value
gleam_error assert "assert"
message The given message The given message
kind The kind of asserted expression The kind of asserted expression
start The byte-index of the start of the assert statement The byte-index of the start of the assert statement
end The byte-index of the end of the assert expression The byte-index of the end of the assert expression
expression_start The byte-index of the start of the asserted expression The byte-index of the start of the asserted expression

But, depending on the expression that was asserted, it contains additional information which can be used to diagnose the error.

Binary operators

assert level >= 30
Key Erlang Type JavaScript Type Value
kind Atom String binary_operator
operator Atom String The binary operator that was used
left Map Object The left hand side of the operator
right Map Object The left hand side of the operator

Function calls

assert check_some_property(a, b, c)
Key Erlang Type JavaScript Type Value
kind Atom String function_call
arguments List of map Array of objects The arguments of the asserted function

Other expressions

assert other_expression
Key Erlang Type JavaScript Type Value
kind Atom String expression
expression Map Object The value of the asserted expression

The expression maps have this structure:

Key Erlang Type JavaScript Type Value
value any any the value the expression evaluated to at runtime
kind Atom String literal or expression or unevaluated
start Int Number The byte-index of the start of this expression in the source code
end Int Number The byte-index of the end of this expression in the source code

If the expression is a literal, such as True or 15, it will have the literal kind. This signals that its value is not runtime dependent, and may not need to be printed.

If the expression is on the right hand side of a short-circuiting operator, like || or &&, it might not be evaluated. If the operator short-circuits, the right hand side expression will have kind unevaluated.