Erlang 的 错误处理

鲁博雅
2023-12-01

顺序代码的错误处理

  1. 抛出错误的函数
    抛错函数说明
    exit(Why)想要终止当前进程时使用,如果这个异常错误没有被捕捉到,信号{‘EXIT’,Pid,Why}就会被广播给当前进程链接的所有进程。
    throw(Why)抛出一个调用者可能想要捕捉的异常错误,注明了被调用函数可能会抛出这个异常错误
    error(Why)是指示“崩溃性错误”,也就是调用者没有准备好处理的非常严重的问题。
  2. 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 F
    catch
        ...                                                  
    end
    % 等同于
    try F of
        Val -> Val
    catch
        ...
    end
    
    try…catch 表达式可以赋值给变量
    X = try ... end,
    
  3. 举例
    % 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
    
 类似资料: