109 lines
3.3 KiB
Markdown
109 lines
3.3 KiB
Markdown
Catch Exceptions
|
|
================
|
|
|
|
{{#include ../links.md}}
|
|
|
|
|
|
When an [exception] is thrown via a [`throw`] statement, evaluation of the script halts
|
|
and the [`Engine`] returns with `Err(Box<EvalAltResult::ErrorRuntime>)` containing the
|
|
exception value that has been thrown.
|
|
|
|
It is possible, via the `try` ... `catch` statement, to _catch_ exceptions, optionally
|
|
with an _error variable_.
|
|
|
|
```rust
|
|
// Catch an exception and capturing its value
|
|
try
|
|
{
|
|
throw 42;
|
|
}
|
|
catch (err) // 'err' captures the thrown exception value
|
|
{
|
|
print(err); // prints 42
|
|
}
|
|
|
|
// Catch an exception without capturing its value
|
|
try
|
|
{
|
|
print(42/0); // deliberate divide-by-zero exception
|
|
}
|
|
catch // no error variable - exception value is discarded
|
|
{
|
|
print("Ouch!");
|
|
}
|
|
|
|
// Exception in the 'catch' block
|
|
try
|
|
{
|
|
print(42/0); // throw divide-by-zero exception
|
|
}
|
|
catch
|
|
{
|
|
print("You seem to be dividing by zero here...");
|
|
|
|
throw "die"; // a 'throw' statement inside a 'catch' block
|
|
// throws a new exception
|
|
}
|
|
```
|
|
|
|
|
|
Re-Throw Exception
|
|
------------------
|
|
|
|
Like the `try` ... `catch` syntax in most languages, it is possible to _re-throw_
|
|
an exception within the `catch` block simply by another [`throw`] statement without
|
|
a value.
|
|
|
|
|
|
```rust
|
|
try
|
|
{
|
|
// Call something that will throw an exception...
|
|
do_something_bad_that_throws();
|
|
}
|
|
catch
|
|
{
|
|
print("Oooh! You've done something real bad!");
|
|
|
|
throw; // 'throw' without a value within a 'catch' block
|
|
// re-throws the original exception
|
|
}
|
|
|
|
```
|
|
|
|
|
|
Catchable Exceptions
|
|
--------------------
|
|
|
|
Many script-oriented exceptions can be caught via `try` ... `catch`:
|
|
|
|
| Error type | Error value |
|
|
| --------------------------------------------- | :------------------------: |
|
|
| Runtime error thrown by a [`throw`] statement | value in `throw` statement |
|
|
| Other runtime error | error message [string] |
|
|
| Arithmetic error | error message [string] |
|
|
| Variable not found | error message [string] |
|
|
| [Function] not found | error message [string] |
|
|
| [Module] not found | error message [string] |
|
|
| Unbound [`this`] | error message [string] |
|
|
| Data type mismatch | error message [string] |
|
|
| Assignment to a calculated/constant value | error message [string] |
|
|
| [Array]/[string] indexing out-of-bounds | error message [string] |
|
|
| Indexing with an inappropriate data type | error message [string] |
|
|
| Error in a dot expression | error message [string] |
|
|
| `for` statement without an type iterator | error message [string] |
|
|
| Error in an `in` expression | error message [string] |
|
|
| Data race detected | error message [string] |
|
|
|
|
|
|
Non-Catchable Exceptions
|
|
------------------------
|
|
|
|
Some exceptions _cannot_ be caught:
|
|
|
|
* Syntax error during parsing
|
|
* System error - e.g. script file not found
|
|
* Script evaluation metrics over [safety limits]({{rootUrl}}/safety/index.md)
|
|
* Function calls nesting exceeding [maximum call stack depth]
|
|
* Script evaluation manually terminated
|