EEP 36: Line numbers in exceptions
April 2nd, 2011
原创文章,转载请注明: 转载自系统技术非业余研究
最近关于Erlang程序在异常打印堆栈时候带上行号信息的提案开始被讨论了,具体看这里:
EEP 36: Line numbers in exceptions: http://www.erlang.org/eeps/eep-0036.html
初学Erlang的人估计都有这个困惑,程序异常的时候打印堆栈不假,但是只打出函数名,如果模块很长的话,很难找到具体发生异常的点,通常再通过打日志的方式来定位,非常的低效无聊。有人开玩笑说是Erlang鼓励写短函数和模块. 我曾经想了个方法解决这个问题, 见 这里 , 但不是完美的方案。
EEP 36则是从编译器直接搞定这个问题,会爽很多, 我们看下他的效果:
-module(example).
-export([m/1]).
-include("header.hrl").
m(L) ->
{ok,lists:map(fun f/1, L)}. %Line 6
%%and the header file header.hrl:
f(X) ->
abs(X) + 1. %Line 2
%%Using R14B01 to call our example module, we get the following result:
1> example:m([-1,0,1,2]).
{ok,[2,1,2,3]}
2> example:m([-1,0,1,2,not_a_number]).
** exception error: bad argument
in function abs/1
called as abs(not_a_number)
in call from example:f/1
in call from lists:map/2
in call from lists:map/2
in call from example:m/1
3> catch example:m([-1,0,1,2,not_a_number]).
{'EXIT',{badarg,[{erlang,abs,[not_a_number]},
{example,f,1},
{lists,map,2},
{lists,map,2},
{example,m,1},
{erl_eval,do_apply,5},
{erl_eval,expr,5},
{shell,exprs,7}]}}
1> example:m([-1,0,1,2]).
{ok,[2,1,2,3]}
2> example:m([-1,0,1,2,not_a_number]).
** exception error: bad argument
in function abs/1
called as abs(not_a_number)
in call from example:f/1 (header.hrl, line 2)
in call from lists:map/2 (lists.erl, line 948)
in call from lists:map/2 (lists.erl, line 948)
in call from example:m/1 (example.erl, line 6)
3> catch example:m([-1,0,1,2,not_a_number]).
{'EXIT',{badarg,[{erlang,abs,[not_a_number],[]},
{example,f,1,[{file,"header.hrl"},{line,2}]},
{lists,map,2,[{file,"lists.erl"},{line,948}]},
{lists,map,2,[{file,"lists.erl"},{line,948}]},
{example,m,1,[{file,"example.erl"},{line,6}]},
{erl_eval,do_apply,5,[{file,"erl_eval.erl"},{line,482}]},
{erl_eval,expr,5,[{file,"erl_eval.erl"},{line,276}]},
{shell,exprs,7,[{file,"shell.erl"},{line,666}]}]}}
希望早日能用上这个功能。
玩得开心!
Post Footer automatically generated by wp-posturl plugin for wordpress.
Status: Final/R15B Proposal is implemented in OTP release R15B
R15B 已经支持, 我在windows 下试验也可以, 但是我在linux 好像没看到, 明天确认一下是不是版本太低了。