11.错误和错误处理 | 11. Errors and Error Handling
11错误和错误处理
11.1术语
错误大致可分为四种不同的类型:
- 编译时错误
- 逻辑错误
- 运行时错误
- 产生的误差
编译时错误,例如语法错误,并不会引起太多麻烦,因为它被编译器捕获。
逻辑错误是程序不按预期运行,但不会崩溃。一个例子是,当图形用户界面中的按钮被点击时没有任何反应。
运行时错误是发生崩溃时。一个例子是当一个运算符被应用于错误类型的参数。Erlang编程语言具有处理运行时错误的内置功能。
运行时错误也可以通过调用erlang:error(Reason)
或模拟erlang:error(Reason, Args)
。
运行时错误是类的异常的另一个名称error
。
生成的错误是代码本身调用exit/1
或throw/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
表达,并且返回类的例外error
从catch
表达。
类的异常error
也称为运行时错误。
11.3处理Erlang中的运行时错误
进程中的错误处理
它可以防止运行时错误和其他异常,以免进程通过使用终止catch
或try
见Expressions
约catch
和try
。
进程间的错误处理
进程可以监视其他进程并检测进程终止,请参阅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_value | receive..after表达式中的超时值被计算为除了整数或无穷大以外的其他值。 |
noproc | 试图链接到一个不存在的过程。 |
{nocatch,V} | 试图评估一个抛出一个捕获。V是抛出的术语。 |
system_limit | 已达到系统限制。有关系统限制的信息,请参见效率指南。 |
Stack
是发生错误时正在评估的函数调用的堆栈,作为{Module,Name,Arity}
最先调用最近函数的元组列表给出。最近的函数调用元组在某些情况下可以是{Module,Name,[Arg]}
。