erlang 顺序编程-错误处理04

本文详细介绍了异常处理的方法,包括如何抛出异常、不同类型的异常及处理方式,并提供了具体的代码示例来展示如何通过try...catch等结构来捕获并处理异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只考虑合法的输入参数,对非法的参数返回值, 而是应该抛出一个异常错误。这条规则被称为“任其崩溃”。

异常类型:

  • 模式匹配错误
  • 传入错误格式参数
  • 带有错误值的 参数 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}
    catch
        throw: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)
    catch
        error:X ->
            {X,erlang:get_stacktrace()}
    end.

 在 try_test.erl这个类下第9行,generate_exception方法报错

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值