Erlang 20

11.错误和错误处理 | 11. Errors and Error Handling

11错误和错误处理

11.1术语

错误大致可分为四种不同的类型:

  • 编译时错误

  • 逻辑错误

  • 运行时错误

  • 产生的误差

编译时错误,例如语法错误,并不会引起太多麻烦,因为它被编译器捕获。

逻辑错误是程序不按预期运行,但不会崩溃。一个例子是,当图形用户界面中的按钮被点击时没有任何反应。

运行时错误是发生崩溃时。一个例子是当一个运算符被应用于错误类型的参数。Erlang编程语言具有处理运行时错误的内置功能。

运行时错误也可以通过调用erlang:error(Reason)或模拟erlang:error(Reason, Args)

运行时错误是类的异常的另一个名称error

生成的错误是代码本身调用exit/1throw/1。请注意,仿真的运行时错误在此处不表示为生成的错误。

生成的错误是类exit和异常的例外throw

当在Erlang中发生运行时错误或生成的错误时,停止执行评估错误表达式的进程。这被称为失败,执行或评估失败,或进程失败终止退出。注意一个进程可以因为除了失败之外的其他原因而终止/退出

终止进程发出退出信号,其退出原因说明发生了哪些错误。通常,有关错误的一些信息被打印到终端。

11.2例外

例外是运行时错误或生成的错误,并且具有三个不同的类,具有不同的来源。所述try表达可以不同类别之间进行区分,而catch表达不能。他们被描述在Expressions

起源
error运行时错误,例如1 + a,或者称为erlang的进程:error / 1,2
exit该过程称为exit / 1
throw这个过程叫做throw / 1

一个异常包括它的类,一个退出原因(参见Exit Reason)和一个堆栈跟踪(它有助于查找异常的代码位置)。

栈跟踪可用来检索erlang:get_stacktrace/0从内try表达,并且返回类的例外errorcatch表达。

类的异常error也称为运行时错误。

11.3处理Erlang中的运行时错误

进程中的错误处理

它可以防止运行时错误和其他异常,以免进程通过使用终止catchtryExpressionscatchtry

进程间的错误处理

进程可以监视其他进程并检测进程终止,请参阅Processes

11.4退出原因

发生运行时错误时,这是​​类的例外error。退出原因是一个元组{Reason,Stack},其中Reason是表示错误类型的术语:

原因错误类型
Bdrg错误的论据。参数是错误的数据类型,或者是其他形式不正确。
Bdrith算术表达式中的错误参数。
{badmatch,V}对匹配表达式的评估失败。值V不匹配。
function_clause评估函数调用时没有找到匹配的函数子句。
{case_clause,V}评估案例表达式时未找到匹配的分支。值V不匹配。
if_clause评估if表达式时未找到真正的分支。
{try_clause,V}评估try表达式的部分时没有找到匹配的分支。值V不匹配。
民主基金评估函数调用时无法找到函数。
{badfun,F}有趣的F有些问题
{badarity,F}有趣的是适用于错误数量的参数。F描述了乐趣和论据。
timeout_valuereceive..after表达式中的超时值被计算为除了整数或无穷大以外的其他值。
noproc试图链接到一个不存在的过程。
{nocatch,V}试图评估一个抛出一个捕获。V是抛出的术语。
system_limit已达到系统限制。有关系统限制的信息,请参见效率指南。

Stack是发生错误时正在评估的函数调用的堆栈,作为{Module,Name,Arity}最先调用最近函数的元组列表给出。最近的函数调用元组在某些情况下可以是{Module,Name,[Arg]}