顺序代码的错误处理
- 抛出错误的函数
抛错函数 说明 exit(Why) 想要终止当前进程时使用,如果这个异常错误没有被捕捉到,信号{‘EXIT’,Pid,Why}就会被广播给当前进程链接的所有进程。 throw(Why) 抛出一个调用者可能想要捕捉的异常错误,注明了被调用函数可能会抛出这个异常错误 error(Why) 是指示“崩溃性错误”,也就是调用者没有准备好处理的非常严重的问题。 - try…catch 表达式。具有一个值。且像是 case表达式 的强化版
省略写法% 首先执行 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…catch 表达式可以赋值给变量% 省略写法 try F catch ... end % 等同于 try F of Val -> Val catch ... end
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