一、 erlang中的错误

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:系统限制错误,某些性能或数据达到系统极限

二、try…catch语法

1. 语法

try FuncOrExpressionSeq of
Pattern1 [when Guard1] -> Expressions1;
Pattern2 [when Guard2] -> Expressions2;
...
catch
ExceptionType1: ExPattern1 [when ExGuard1] -> ExExpressions1;
ExceptionType2: ExPattern2 [when ExGuard2] -> ExExpressions2;
...
after
AfterExpressions
end

返回值:try表达式具有一个值;如果try FuncOrExpressionSeq后没有of部分,则默认为FuncOrExpressionSeq的返回值;

异常处理语句发生异常:如果在of部分或者catch部分,发生了异常,那么异常将不被处理,直接抛出;

catch语句块的ExceptionType1前内容省略的话,默认的错误标签是throw

after部分:after之后的代码是用来在FuncOrExpressionSeq结束后执行清理的,这段代码一定会被执行。并且FuncOrExpressionSeq的返回值会被丢弃。

2. 测试代码

代码部分:

-module(test_try).
-compile([export_all]).
-author('cheng litaocheng@gmail.com').
%% @spec test(F1, F2) -> Result
%% @doc evaluate the F , use the try to catch all kinds of error
%% F1 the Expression to be catch exception
%% F2 the Expression evaluate in the catch section
test(F1, F2) when (is_function(F1, 0) andalso is_function(F2, 0)) ->
try F1()
catch
throw:X ->
{{caught, throw, X}, F2()};
exit:X ->
{{caught, exit, X}, F2()};
error:X ->
{{caught, error, X}, F2()}
after
io:format("always evaluate the after body~n")
end.

测试结果:

21> c(test_try).
{ok,test_try} 22> test_try:test(fun() -> throw(hello) end, fun() -> ok end).
always evaluate the after body
{{caught,throw,hello},ok} 23> test_try:test(fun() -> exit(hello) end, fun() -> ok end).
always evaluate the after body
{{caught,exit,hello},ok} 24> test_try:test(fun() -> erlang:error(hello) end, fun() -> ok end).
always evaluate the after body
{{caught,error,hello},ok} 25> test_try:test(fun() -> erlang:error(hello) end, fun() -> throw(exception_in_catch) end).
always evaluate the after body
** exception throw: exception_in_catch
in function test_try:test/2

参考及整理自:

[1] http://erlangdisplay.iteye.com/blog/315417

[2] http://blog.sina.com.cn/s/blog_53a5047b01018wp5.html

[erlang 001] erlang中的错误及异常处理的更多相关文章

  1. Yii中的错误及异常处理

    Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...

  2. 【PHP】解析PHP中的错误和异常处理

    目录结构: contents structure [-] 错误级别 自定义处理器 设置异常日志 自定义异常类 在这篇文章中,笔者将会阐述PHP中的异常处理,希望能够对你有所帮助. 1.错误级别 PHP ...

  3. 经常出现在python中的错误和异常处理

    PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://t.cn/A6Zvjdun 使用try except处理异常 上面的代码中,被除数是0,会引发ZeroDivisio ...

  4. Golang错误和异常处理的正确姿势

    Golang错误和异常处理的正确姿势 错误和异常是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从 ...

  5. Erlang运行中的错误

    Erlang运行时发生错误时,会返回一些错误信息,理解这些信息,对于学好.用好Erlang来说是必要. Erlang中的运行错误包括:badarg, badarith, badmatch, funct ...

  6. Erlang中一些错误或者异常的标识

    erlang中错误大体分为四种: 1. 编译错误    2. 逻辑错误    3. 运行时错误    4. 用户代码生成的错误 编译错误,主要是编译器检测出的代码语法错误 逻辑错误,是指程序没有完成预 ...

  7. PHP中的错误处理、异常处理机制详解

    在编写PHP程序时,错误处理是一个重要的部分.如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门 例: <?php $a = fopen('test.txt','r'); / ...

  8. 转载: 让我们聊聊Erlang的nif中资源的安全释放

    让我们聊聊Erlang的nif中资源的安全释放 http://my.oschina.net/u/236698/blog/479221

  9. EBS OAF开发中的错误/异常处理(ErrorHandling) (转)

    原文地址 EBS OAF开发中的错误/异常处理(ErrorHandling) EBS OAF开发中的错误/异常处理(ErrorHandling) (版权声明,本人原创或者翻译的文章如需转载,如转载用于 ...

随机推荐

  1. HDFS(二)

    HDFS的I/O主要是三个方面: 一致性 HDFS在一致性上面主要是通过校验和(checksum)来实现:从client发起写入的时候会校验一下文件内容,但是发生在pipeline的最后一个节点的时候 ...

  2. win10下安装并启动zookeeper

    下载直接到zk的官网(zookeeper.apache.org)即可,点击右边的Releases,在Download下再点Download进入镜像下载页面,在给出的链接列表里选择一个镜像地址,进去后选 ...

  3. Unit07: MyBatis框架简介 、 MyBatis基本应用

    Unit07: MyBatis框架简介 . MyBatis基本应用 1. myBatis (1)myBatis是什么? 是一个开源的持久层框架. 注:myBatis底层仍然是jdbc. (2)编程步骤 ...

  4. 解决Intel SSD 330i 240G在Windows 8启动慢的问题

    笔者半年前更新了一下老迈的Thinkpad T410i笔记本电脑,在美国亚马逊海购了Intel SSD 330i 240G.(PS:购入价USD 129.99 ,现在最新的335i 240G差不多要U ...

  5. Top Android App使用的组件

    唱吧_462 smack:de.measite.smack:??? ???:org.apache:??? smack:org.jivesoftware.smack:XMPP客户端类库 dnsjava: ...

  6. VBA7种遍历方法

    Sub 在选定文档最后加入一句话() '遍历文件 Dim MyDialog As FileDialog On Error Resume NextApplication.ScreenUpdating = ...

  7. Apache的下载安装(主要说的 64位)及问题

    本文转载自:http://blog.csdn.net/qq_15096707/article/details/47319545 今天重装完win10系统,就重新下载安装 Apache.虽说之前有安装过 ...

  8. 第四章.使用ant编译hadoop eclipse插件

    从hadoop 0.20.203以后,hadoop的发布包里,不再对eclipse插件进行jar包发布,而是给出了打包的代码,需要各位开发人员自己进行打包和设置.我们打的包必须跟自己使用的hadoop ...

  9. Linux 利用hosts.deny 防止暴力破解ssh

    一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7 ...

  10. Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API log if possible. <class 'sqlalchemy.exc.OperationalError'> (HTTP 500) (Request-ID: req-6ac88345-ce5a

    Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API ...