作者: | 来源:互联网 | 2023-06-24 06:21
只考虑合法的输入参数,对非法的参数返回值, 而是应该抛出一个异常错误。这条规则被称为“任其崩溃”。
异常类型:
- 模式匹配错误
- 传入错误格式参数
- 带有错误值的 参数 2/0
exit(Why) :想要终止当前进程,用它。没有被捕获,会广播给所有连接的其他进程。
throw(Why) :抛出一个调用者可以捕获的异常。
error(Why) :系统崩溃
try...catch 捕获异常
try ... of ..catch ...end 异常是在of之前捕获,try...catch...end异常是在catch前捕获
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 -> {N,normal,Val}catchthrow:X -> {N,caught,thrown,X};exit:X -> {N,caught,exit,X};error:X -> {N,caught,error,X}end.
捕获异常方式2,不同量级的调试 信息。
demo2() -> [{I,(catch generate_exception(I))} || I <- [1,2,3,4,5]].
指定异常抛出
sqrt(X) when X <0 ->error({"square error <0 value", X});
sqrt(X) ->math:sqrt(X).
换种使用方式,正常做什么,异常做什么
case f(X) of {ok,Val} -> {"success",Val};{error,Why} -> {"error",Why}
end.
上面都是指定了错误类型的代码,下面是捕获所有错误代码
有错误标签 _下划线类似模糊查询
try f(X)
catch_:_ -> {"failure",X}
end.
没标签
try f(X)
catch_ -> {"失败!",X}
end.
栈跟踪,找到错误的跟踪信息,找到错误的具体位置
此栈跟踪信息不会记录函数被调用时的位置,只会记录它将要返回的位置。
erlang:get_stacktrace()
demo3() -> try generate_exception(5)catcherror:X ->{X,erlang:get_stacktrace()}end.
在 try_test.erl这个类下第9行,generate_exception方法报错