sandbox/pe/error_test.erl

46 lines
1.3 KiB
Erlang
Raw Permalink Normal View History

2019-04-23 06:16:59 +00:00
-module(error_test).
-export([generate_exc/1, demo1/0, demo2/0, demo3/0, catcher/1]).
generate_exc(1) -> a;
generate_exc(2) -> throw(a);
generate_exc(3) -> exit(a);
generate_exc(4) -> {'EXIT', a};
generate_exc(5) -> error(a).
demo1() ->
[catcher(I) || I <- lists:seq(1, 5)].
demo2() ->
[{I, (catch generate_exc(I))} || I <- [1,2,3,4,5]].
catcher(N) ->
try generate_exc(N) of
Val -> {N, normal, Val}
catch
throw:X -> {N, caught, thrown, X};
exit:X -> {N, caught, exited, X};
error:X -> {N, caught, error, X}
end.
%% NB: catch _ -> ... assumes default tag throw, need to specify
%% catch _:_ -> ...
demo3() ->
try generate_exc(5)
catch
error:X ->
{X, erlang:get_stacktrace()}
end.
%% In Erlang, when an error is detected internally by the system or is
%% detected by program logic, the correct approach is to crash
%% immediately and generate a meaningful error message. We crash
%% immediately so as not to make matters worse. The error message should
%% be written to a permanent error log and be sufficiently detailed so
%% that we can figure out what went wrong later.
%%
%% Second, fail politely means that only the programmer should see the
%% detailed error messages produced when a program crashes. A user of the
%% program should never see these messages.