Home > Erlang探索 > EEP 36: Line numbers in exceptions

EEP 36: Line numbers in exceptions

April 2nd, 2011

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: EEP 36: Line numbers in exceptions

最近关于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.

Categories: Erlang探索 Tags: ,
  1. piboyeliu
    June 8th, 2013 at 01:06 | #1

    Status: Final/R15B Proposal is implemented in OTP release R15B
    R15B 已经支持, 我在windows 下试验也可以, 但是我在linux 好像没看到, 明天确认一下是不是版本太低了。

Comments are closed.