- 浏览: 968462 次
- 性别:
- 来自: 广州
最新评论
-
qingchuwudi:
有用,非常感谢!
erlang进程的优先级 -
zfjdiamond:
你好 这条命令 在那里输入??
你们有yum 我有LuaRocks -
simsunny22:
这个是在linux下运行的吧,在window下怎么运行escr ...
escript的高级特性 -
mozhenghua:
http://www.erlang.org/doc/apps/ ...
mnesia 分布协调的几个细节 -
fxltsbl:
A new record of 108000 HTTP req ...
Haproxy 1.4-dev2: barrier of 100k HTTP req/s crossed
郎咸武<langxianzhe@163.com> 同学在erlang-china上post了一个问题:
请注意编号为91和92两行运行结果,请问为什么会出现两种结果。
一个抛出 {error,{badmatch,5}}
另一个抛出** exception error: no match of right hand side value 4
view source
print?
01 root@ubuntu:/usr/src/otp# erl
02 Erlang R13B04 (erts-5.7.5) [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false
03 88> X=1.
04 1
05 89> try (X=5) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
06 {error,{badmatch,5}}
07 90> try (X=1) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
08 {normal,1}
09 91> try (X=5) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
10 {error,{badmatch,5}}
11 92> try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
12 ** exception error: no match of right hand side value 4
13 93> self().
14 <0.36.0>
15 94> catch try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end. %%这个异常是 shell捕获到了 进一步处理后的结果
16 {'EXIT',{{badmatch,4},[{erl_eval,expr,3}]}}
17 95> try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
18 ** exception error: no match of right hand side value 4
19 96> self().
20 <0.36.0>
竟然是EXIT, 这时候shell也换了pid了, 这是怎么回事呢?
由于在shell输入的程序是公司允许的, 我们也可以从出错的stack里面看到是 erl_eval:expr函数异常了.
现在让我们对系统打patch如下:
lib/stdlib/src/erl_eval.erl
view source
print?
1 282expr({match,_,Lhs,Rhs0}, Bs0, Lf, Ef, RBs) ->
2 283 {value,Rhs,Bs1} = expr(Rhs0, Bs0, Lf, Ef, none),
3 284 case match(Lhs, Rhs, Bs1) of
4 285 {match,Bs} ->
5 286 ret_expr(Rhs, Bs, RBs);
6 287 nomatch ->
7 288 io:format("expr nomatch->pid:~p~n~p~n",[self(), Rhs]), %%添加诊断
8 289 erlang:raise(error, {badmatch,Rhs}, stacktrace())
9 290 end;
erts/emulator/beam/bif.c
view source
print?
01 1142/**********************************************************************/
02 1143/* raise an exception of given class, value and stacktrace.
03 1144 *
04 1145 * If there is an error in the argument format,
05 1146 * return the atom 'badarg' instead.
06 1147 */
07 1148Eterm
08 1149raise_3(Process *c_p, Eterm class, Eterm value, Eterm stacktrace) {
09 ...
10 1222 erts_print(ERTS_PRINT_STDOUT, NULL, "raise->proc:%T\nclass=%T\nvalue=%T\nstacktrace=%T\n", c_p->id, class, value, c_p->ftrace); /*添加诊断*/
11 1223 BIF_ERROR(c_p, reason);
12 ...
13 }
然 后我们在运行上面的语句:
view source
print?
01 root@ubuntu:~/otp# bin/erl
02 Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]
03
04 Eshell V5.7.5 (abort with ^G)
05 1> X=1.
06 1
07 2> try (X=5) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
08 expr nomatch->pid:<0.32.0>
09 5
10 raise->proc:<0.32.0>
11 class=error
12 value={badmatch,5}
13 stacktrace=[[{erl_eval,expr,3}
14 {error,{badmatch,5}}
15 3> try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
16 expr nomatch->pid:<0.32.0>
17 4
18 raise->proc:<0.32.0>
19 class=error
20 value={badmatch,4}
21 stacktrace=[[{erl_eval,expr,3}]|-000000000000000016]
22 raise->proc:<0.32.0>
23 class=error
24 value={badmatch,4}
25 stacktrace=[[{erl_eval,expr,3}]|-000000000000000016]
很奇怪的是第3句raise了2次. 让我们回到程序好好看下:
view source
print?
1 X=1. %%这行绑定了一个变量X=1
2 try (X=5) of Val ->{normal,Val} catch error:Error -> {error,Error} end. %%这行由于异常会试图绑定变量Error={badmatch,5}, 由于之前Error不存在, 绑定成功.
3 try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end. %%这行由于异常会绑定了变量Error={badmatch,4}, 由于Error存在, 而且值是{badmatch,5},所以这时候catch就出
4 现异常了, 往外抛出{'EXIT',{{badmatch,4},[{erl_eval,expr,3}]}}.
这 下我们明白了, 是这个catch惹的祸了.
我们再实验下我们的分析:
view source
print?
01 root@ubuntu:~# erl
02 Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
03
04 Eshell V5.7.5 (abort with ^G)
05 1> X=1.
06 1
07 2> b().
08 X = 1
09 ok
10 3> try (X=5) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
11 {error,{badmatch,5}}
12 4> b().
13 Error = {badmatch,5}
14 X = 1
15 ok
16 5> try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
17 ** exception error: no match of right hand side value 4
18 6> f(Error).
19 ok
20 7> b().
21 X = 1
22 ok
23 8> try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
24 {error,{badmatch,4}}
25 9>
Bingo成功.
结论: 要非常小心Erlang语法的变量绑定,在不同的路线会有不同的绑定,容易出问题.
请注意编号为91和92两行运行结果,请问为什么会出现两种结果。
一个抛出 {error,{badmatch,5}}
另一个抛出** exception error: no match of right hand side value 4
view source
print?
01 root@ubuntu:/usr/src/otp# erl
02 Erlang R13B04 (erts-5.7.5) [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false
03 88> X=1.
04 1
05 89> try (X=5) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
06 {error,{badmatch,5}}
07 90> try (X=1) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
08 {normal,1}
09 91> try (X=5) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
10 {error,{badmatch,5}}
11 92> try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
12 ** exception error: no match of right hand side value 4
13 93> self().
14 <0.36.0>
15 94> catch try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end. %%这个异常是 shell捕获到了 进一步处理后的结果
16 {'EXIT',{{badmatch,4},[{erl_eval,expr,3}]}}
17 95> try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
18 ** exception error: no match of right hand side value 4
19 96> self().
20 <0.36.0>
竟然是EXIT, 这时候shell也换了pid了, 这是怎么回事呢?
由于在shell输入的程序是公司允许的, 我们也可以从出错的stack里面看到是 erl_eval:expr函数异常了.
现在让我们对系统打patch如下:
lib/stdlib/src/erl_eval.erl
view source
print?
1 282expr({match,_,Lhs,Rhs0}, Bs0, Lf, Ef, RBs) ->
2 283 {value,Rhs,Bs1} = expr(Rhs0, Bs0, Lf, Ef, none),
3 284 case match(Lhs, Rhs, Bs1) of
4 285 {match,Bs} ->
5 286 ret_expr(Rhs, Bs, RBs);
6 287 nomatch ->
7 288 io:format("expr nomatch->pid:~p~n~p~n",[self(), Rhs]), %%添加诊断
8 289 erlang:raise(error, {badmatch,Rhs}, stacktrace())
9 290 end;
erts/emulator/beam/bif.c
view source
print?
01 1142/**********************************************************************/
02 1143/* raise an exception of given class, value and stacktrace.
03 1144 *
04 1145 * If there is an error in the argument format,
05 1146 * return the atom 'badarg' instead.
06 1147 */
07 1148Eterm
08 1149raise_3(Process *c_p, Eterm class, Eterm value, Eterm stacktrace) {
09 ...
10 1222 erts_print(ERTS_PRINT_STDOUT, NULL, "raise->proc:%T\nclass=%T\nvalue=%T\nstacktrace=%T\n", c_p->id, class, value, c_p->ftrace); /*添加诊断*/
11 1223 BIF_ERROR(c_p, reason);
12 ...
13 }
然 后我们在运行上面的语句:
view source
print?
01 root@ubuntu:~/otp# bin/erl
02 Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]
03
04 Eshell V5.7.5 (abort with ^G)
05 1> X=1.
06 1
07 2> try (X=5) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
08 expr nomatch->pid:<0.32.0>
09 5
10 raise->proc:<0.32.0>
11 class=error
12 value={badmatch,5}
13 stacktrace=[[{erl_eval,expr,3}
14 {error,{badmatch,5}}
15 3> try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
16 expr nomatch->pid:<0.32.0>
17 4
18 raise->proc:<0.32.0>
19 class=error
20 value={badmatch,4}
21 stacktrace=[[{erl_eval,expr,3}]|-000000000000000016]
22 raise->proc:<0.32.0>
23 class=error
24 value={badmatch,4}
25 stacktrace=[[{erl_eval,expr,3}]|-000000000000000016]
很奇怪的是第3句raise了2次. 让我们回到程序好好看下:
view source
print?
1 X=1. %%这行绑定了一个变量X=1
2 try (X=5) of Val ->{normal,Val} catch error:Error -> {error,Error} end. %%这行由于异常会试图绑定变量Error={badmatch,5}, 由于之前Error不存在, 绑定成功.
3 try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end. %%这行由于异常会绑定了变量Error={badmatch,4}, 由于Error存在, 而且值是{badmatch,5},所以这时候catch就出
4 现异常了, 往外抛出{'EXIT',{{badmatch,4},[{erl_eval,expr,3}]}}.
这 下我们明白了, 是这个catch惹的祸了.
我们再实验下我们的分析:
view source
print?
01 root@ubuntu:~# erl
02 Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
03
04 Eshell V5.7.5 (abort with ^G)
05 1> X=1.
06 1
07 2> b().
08 X = 1
09 ok
10 3> try (X=5) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
11 {error,{badmatch,5}}
12 4> b().
13 Error = {badmatch,5}
14 X = 1
15 ok
16 5> try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
17 ** exception error: no match of right hand side value 4
18 6> f(Error).
19 ok
20 7> b().
21 X = 1
22 ok
23 8> try (X=4) of Val ->{normal,Val} catch error:Error -> {error,Error} end.
24 {error,{badmatch,4}}
25 9>
Bingo成功.
结论: 要非常小心Erlang语法的变量绑定,在不同的路线会有不同的绑定,容易出问题.
发表评论
-
OTP R14A今天发布了
2010-06-17 14:36 2611以下是这次发布的亮点,没有太大的性能改进, 主要是修理了很多B ... -
R14A实现了EEP31,添加了binary模块
2010-05-21 15:15 2964Erlang的binary数据结构非常强大,而且偏向底层,在作 ... -
如何查看节点的可用句柄数目和已用句柄数
2010-04-08 03:31 4738很多同学在使用erlang的过程中, 碰到了很奇怪的问题, 后 ... -
获取Erlang系统信息的代码片段
2010-04-06 21:49 3388从lib/megaco/src/tcp/megaco_tcp_ ... -
iolist跟list有什么区别?
2010-04-06 20:30 6429看到erlang-china.org上有个 ... -
erlang:send_after和erlang:start_timer的使用解释
2010-04-06 18:31 8253前段时间arksea 同学提出这个问题, 因为文档里面写的很不 ... -
Latest news from the Erlang/OTP team at Ericsson 2010
2010-04-05 19:23 1933参考Talk http://www.erlang-factor ... -
Erlang ERTS Async基础设施
2010-03-19 00:03 2439其实Erts的Async做的很不错的, 相当的完备, 性能又高 ... -
CloudI 0.0.9 Released, A Cloud as an Interface
2010-03-09 22:32 2421基于Erlang的云平台 看了下代码 质量还是不错的 完成了不 ... -
Memory matters - even in Erlang (再次说明了了解内存如何工作的必要性)
2010-03-09 20:26 3372原文地址:http://www.lshift.net/blog ... -
Some simple examples of using Erlang’s XPath implementation
2010-03-08 23:30 1998原文地址 http://www.lshift.net/blog ... -
lcnt 环境搭建
2010-02-26 16:19 2542抄书:otp_doc_html_R13B04/lib/tool ... -
Erlang强大的代码重构工具 tidier
2010-02-25 16:22 2429Jan 29, 2010 We are very happy ... -
[Feb 24 2010] Erlang/OTP R13B04 has been released
2010-02-25 00:31 1338Erlang/OTP R13B04 has been rele ... -
R13B04 Installation
2010-01-28 10:28 1341R13B04后erlang的源码编译为了考虑移植性,就改变了编 ... -
Running tests
2010-01-19 14:51 1396R13B03以后 OTP的模块加入了大量的测试模块,这些模块都 ... -
R13B04在细化Binary heap
2010-01-14 15:11 1451从github otp的更新日志可以清楚的看到otp R13B ... -
R13B03 binary vheap有助减少binary内存压力
2009-11-29 16:07 1596R13B03 binary vheap有助减少binary内存 ... -
erl_nif 扩展erlang的另外一种方法
2009-11-26 01:02 3136我们知道扩展erl有2种方法, driver和port. 这2 ... -
escript的高级特性
2009-11-25 05:42 5851escript Erlang scripting suppor ...
相关推荐
易语言简单处理TRY异常源码,简单处理TRY异常,try_进入区域,try_退出区域,try_退出区域_完毕,取寄存器EAX
java try…catch捕获异常的实例 java try…catch捕获异常的实例
java try…catch嵌套捕获异常的实例 java try…catch嵌套捕获异常的实例
易语言简单处理TRY异常源码。@易语言在线学习。
易语言源码易语言简单处理TRY异常源码.rar 易语言源码易语言简单处理TRY异常源码.rar 易语言源码易语言简单处理TRY异常源码.rar 易语言源码易语言简单处理TRY异常源码.rar 易语言源码易语言简单处理TRY异常源码....
使用try-catch-finally处理异常
#python的try语句有两种风格 #一:种是处理异常(try/except/else) #二:种是无论是否发生异常都将执行最后的代码(try/finally) try/except/else风格 try: <语句> #运行别的代码 except <名字>: <...
异常处理try catch在vc中的用法.zip visual c++ try catch处理异常
try-catch-finally捕获异常try-catch-finally捕获异常
ASP.NET最佳异常处理:try-catch语句捕获异常 ASP.NET最佳异常处理:try-catch语句捕获异常
C++ ,VS2010平台编辑,下载后可以直接使用,异常处理(try_catch)
selenium的try except 捕获异常.docx
一.什么是异常 我们需要明白的是异常的发生不是因为我们代码写错了,我们的代码是可以编译的,但是在运行时产生了一个错误,这个错误是一个异常情况,计算机不能处理这个...第二种方法:使用try语句处理异常,事实上
C语言异常封装 模仿try catch 源码可以运行,C语言是JAVA的鼻祖
题目:输入两个整数将其整除,用try-catch语句捕获除数为0的异常。 本代码是c#语言编写的关于异常处理的代码,运行正常。
2. 运行时异常和一般异常(受检异常)区别是什么? 3. JVM 是如何处理异常的? 4. throw 和 throws 的区别是什么? 5. final、finally、finalize 有什么区别? 6. NoClassDefFoundError 和 ClassNotFoundException ...
Delphi异常处理try_except语句和try_finally语句用法以及区别.pdf Delphi异常处理try_except语句和try_finally语句用法以及区别.pdf
主要介绍了Springboot全局异常捕获及try catch区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
try-except处理异常常见分类,只要包含在python中怎样通过try-except实现整个程序的戳一异常处理等工作。
C++语言处理异常 try catch throw,带程序例子