异常捕捉
try…catch
调用一个函数,如果返回异常,则进行处理,否则正常执行
%% demo.erl
-module(demo)
%% 主动模拟错误的函数
generate_exception(1) -> a; %% 正常返回
generate_exception(2) -> throw(a); %% 异常错误
generate_exception(3) -> exit(a); %% 终止
generate_exception(4) -> {'EXIT', a}; %% 返回的值不在模式匹配中
generate_exception(5) -> error(a). %% 崩溃性错误
demo1() ->
[catcher(I) || I <- [1,2,3,4,5]].
catcher(N) ->
try generate_exception(N) of
%% Val 是调用 generate_exception 后返回的值
Val -> {N, normal, Val}
catch
throw:X -> {N, caught, thrown, X};
exit:X -> {N, caught, thrown, X};
error:X -> {N, caught, thrown, X}
end.
%% 运行结果
%% [{1, normal, a},{2,caught,thrown,a},{3,caught,exited,a},{4,normal,{'EXIT',a}},{5,caught,error,a}]
堆栈
捕捉到异常时,可以调用
erlang:get_stacktrace()
得到调用堆栈,来追寻问题