抛错函数 | 说明 |
---|---|
exit(Why) | 想要终止当前进程时使用,如果这个异常错误没有被捕捉到,信号{‘EXIT’,Pid,Why}就会被广播给当前进程链接的所有进程。 |
throw(Why) | 抛出一个调用者可能想要捕捉的异常错误,注明了被调用函数可能会抛出这个异常错误 |
error(Why) | 是指示“崩溃性错误”,也就是调用者没有准备好处理的非常严重的问题。 |
% 首先执行 FuncOrExpessionSeq
% 如果没有错误,就会与 Pattern1、Pattern2等模式进行匹配,直到匹配成功
% 如果匹配,try...catch表达式的值就通过执行匹配模式之后的表达式序列得出
try FuncOrExpressionSeq of
Pattern1 [when Guard1] -> Expreesions1;
Pattern2 [when Guard2] -> Expreesions2;
...
% 如果发生异常错误,那么 ExPattern1 等捕捉模式就会与它进行匹配
% 找出应该执行哪一段表达式序列
% ExceptionType 是一个原子(throw、exit和error其中之一)
% 如果省略了 ExceptionType,就会使用默认值 throw。
catch
ExceptionType1: ExPattern1 [when ExGuard1] -> ExExpreesions1;
ExceptionType2: ExPattern2 [when ExGuard2] -> ExExpreesions2;
...
% 关键字 after 之后的代码是用来在 FuncOrExpressionSeq 结束后执行清理的
% 这段代码一定会被执行,哪怕有异常错误抛出也是如此
% after区块的代码会在try或catch区块里的 Expressions 代码完成后立即运行
% AfterExpressions 的返回值会被丢弃
% after部分也可以省略
after
AfterExpressions
end
省略写法% 省略写法
try F
catch
...
end
% 等同于
try F of
Val -> Val
catch
...
end
try…catch 表达式可以赋值给变量X = try ... end,
% try_test.erl
generate_exception(1) -> a;
generate_exception(2) -> throw(a);
generate_exception(3) -> exit(a);
generate_exception(4) -> {'EXIT', a};
generate_exception(5) -> error(a).
% try_test1.erl
demo1() -> [catcher(I) || I <- [1,2,3,4,5]].
catcher(N) ->
try generate_exception(N) of
Val -> {N, normal, Val}
catch
throw:X ->
end