Erlang中异常的大致问题

本文详细解释了Erlang编程中的各种错误类型,包括编译错误、逻辑错误、运行时错误和用户代码生成的错误。重点介绍了error、throw和exit三种异常类型及其处理方式,并讨论了try/catch机制以及在不同场景下的常见错误码。
摘要由CSDN通过智能技术生成

1. 分类
    1) 编译错误:主要是编译器检测出的代码语法错误;
    2) 逻辑错误:是指程序没有完成预期的工作,属于开发人员的问题;
    3) 运行时错误:是指erlang运行时抛出的错误,比如对非数据类型执行算术运算,erlang运行时会捕获异常,并抛出。在erlang中,这类异常的类型为error;
    4) 用户代码生成的错误:是指通过exit/1或者throw/1生成。
2. 异常
我们把运行时错误以及用户抛出的错误称为异常(exception),他们具有三种类型:throw, error, exit。
    1) error型异常,通过erlang:error/1, 2生成,用于抛出那些“崩溃错误”。这种异常应该是调用者不会真正意识到要去处理的那些致命错误;
    2) throw型异常,通过throw/1生成,用于抛出一个调用者可能会捕获的异常。针对throw,必须为函数添加注释,说明他会抛出这个异常。调用者可以选择:忽略这些异常/对异常进行处理;
    3) exit型异常,通过exit/1生成,当想要终止当前进程时,用这个函数。如果这个消息未被捕获,那么系统会向所有与当前进程连接的进程广播{'EXIT',Pid,Reason}消息
3. 异常的捕获
在erlang中,进程内的异常可以通过try, catch来进行捕获处理。
推荐使用try,其为新添加的语法。进程间的异常可以通过监督树(supervisor tree),监控进程(monitor)来实现。
如果是通过catch捕捉这三种异常,则返回的结果分别是:
• throw(Any) -> Term
• exit(Reason) -> {'EXIT',Reason}
• error(Reason) -> {'EXIT',{Reason,erlang:get_stacktrace()}}
4. 一些场景的报错类型
badarg:参数错误,参数格式或类型错误
badarith:算术表达式错误,算术表达式中含有错误的参数
{badmatch,V}:模式匹配错误,V指具体的发生匹配错误的数值
function_clause:函数子句错误,没有找到匹配的函数子句
{case_clause,V}:case匹配错误,没有找到匹配的case pattern
if_clause:if子句错误,没有找到为ture的if子句
{try_clause,V}:try匹配错误,执行try时,没有找到匹配的pattern
undef:函数未定义错误
{badfun,F}:函数错误
{badarity,F}:函数参数个数错误
timeout_value:超时参数错误,在receive.. after语法中,after对应的超时数据错误(应为不小于0的integer或infinity
noproc:Process 错误,Process不存在
{nocatch,V}:throw未被catch
system_limit:系统限制错误,某些性能或数据达到系统极限

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值