Recover in Erlang
In Erlang, we can use the concept of “try-catch” to handle exceptions, which is similar to recovering from panics in other languages. Here’s an example of how to implement this:
-module(recover).
-export([main/0]).
% This function throws an exception.
may_throw() ->
throw("a problem").
main() ->
% We use a try-catch block to handle exceptions
try
may_throw(),
% This code will not run because may_throw() throws an exception
io:format("After may_throw()~n")
catch
% The catch clause will handle the exception
Error:Reason ->
io:format("Recovered. Error:~n~p~n", [Reason])
end.
In Erlang, we use throw/1
to raise an exception, which is similar to panicking in other languages. The try-catch
block is used to handle exceptions, which is analogous to using defer
and recover
in some other languages.
The may_throw/0
function throws an exception with the message “a problem”.
In the main/0
function:
- We wrap the potentially exception-throwing code in a
try
block. - The
catch
clause is used to handle any exceptions that might be thrown. - If an exception is caught, we print a message along with the reason for the exception.
This structure allows us to handle exceptions and continue execution, rather than letting the exception crash the entire program.
To run this program:
$ erlc recover.erl
$ erl -noshell -s recover main -s init stop
Recovered. Error:
"a problem"
In this example, the code after may_throw()
in the try
block doesn’t execute because an exception is thrown. Instead, execution jumps to the catch
clause, which handles the exception and allows the program to continue running.
This demonstrates how Erlang’s exception handling can be used to recover from errors and maintain program execution, similar to recovering from panics in other languages.