Erlang/OTP R15Bで例外発生時の行番号を知る
R15B が昨年12月に出ました。NewsのHighlightsを見ると、「Line number and filename information are now included in exception backtraces.」という一文が。
どれどれ...
-module(test). -compile(export_all). test_fail() -> A = 1, B = 2, A = B. test() -> try test_fail() catch Class:Reason -> io:format("~p:~p ~p~n", [Class, Reason, erlang:get_stacktrace()]) end.
34> c(test). {ok,test} 35> test:test_fail(). ** exception error: no match of right hand side value 2 in function test:test_fail/0 (test.erl, line 7) 36> test:test(). error:{badmatch,2} [{test,test_fail,0,[{file,"test.erl"},{line,7}]}, {test,test,0,[{file,"test.erl"},{line,11}]}, {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,576}]}, {shell,exprs,7,[{file,"shell.erl"},{line,668}]}, {shell,eval_exprs,7,[{file,"shell.erl"},{line,623}]}, {shell,eval_loop,3,[{file,"shell.erl"},{line,608}]}] ok
すごい..!!! これはうれしいですね。今までは、例外発生時に行情報が欲しければsmart_exceptionsを使うという選択肢があったものの、常に使い続けるのはなかなか難しいものがあったと個人的には思っています(以前ちょっと使ってみて、それっきりになっておりました)。標準できちんと情報をくっつけてくれる恩恵は非常にでかいですね。
しかしR15Bが出ていることに気付くのに3ヶ月もかかっているのでひどい話です。8コアマシンにErlang入れようとしてやっと気付いた有様です。