1

以下のコードを検討してください。

 -module(except).
 -compile(export_all).

 divone(X)->    erlang:error({badnews,erlang:get_stacktrace()}),1/X-1.
 tryreturn(X)->

      try divone(X) of
     Val->{result,2/Val}
    catch
    exit:Reason->{exit,Reason};
    throw:Throw->{throw,Throw};
    error:Error->{error,Error}
 end.

シェルでコードをテストします。

 Eshell V5.9.1  (abort with ^G)

 1> c(except).
 {ok,except}
 2> except:tryreturn(10). **%why cant't get stack trace info here?**
 {error,{badnews,[]}}          
 3> except:tryreturn(10). **%why can get here?**
 {error,{badnews,[{except,divone,1,
                     [{file,"except.erl"},{line,4}]},
             {except,tryreturn,1,[{file,"except.erl"},{line,7}]},
             {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}]}]}}
4

2 に答える 2

1

例外が発生していない場合、によって返されるスタック トレースerlang:backtrace()は空です。

erlang:backtrace()例外をキャッチしたかどうかに関係なく、命令ポインターとプロセスのコールスタックを含むものは、あなたよりも役立つものです。

これはチケットである必要があります:

io:format("~s~n", [element(2, process_info(self(), backtrace))]).

(当然、自己は他者と自由に交換できますPid

于 2012-09-04T02:34:23.297 に答える