2009-08-26 5 views
14

私はそれをキャッチした後に、例外スタックトレースをerlangに書き込むことができますか?

try code_that_fails() 
catch _:_ -> ..... 

キャッチブロックにスタックトレースを印刷するにはどうすればよいですか?そのブロックはすべての例外をキャッチしますが、スタックの印刷方法はわかりません...

私を助けてくれますか?

+0

フランチェスコあなたは答えの一つに満足している場合、単に 'catch'は一般的に悪いフォームと見なされている使用して、適切な/満足な答え – gleber

答えて

19

get_stacktrace/0を参照すると、呼び出しプロセスで最後の例外のスタックトレースを取得できます。

try 
    code_that_fails() 
catch 
    _:_ -> 
     erlang:display(erlang:get_stacktrace()) 
end 
4

例では、tryは不要です。あなただけの例外が発生した場合

result = (catch code_that_fails()). 

を行うことができ、catcherror code and stack trace含まタプルを返します。

例外をマスクできるので、これは一般的に悪い習慣とみなされます。別の答えに記述されているstacktraceアプローチは、ほぼ確実にあなたが望むものです。

tryは、元のcatchの機能拡張です。それを使用する場合は、キャッチする例外タイプごとに句を指定し、適切に処理する必要があります。詳細および明確な例については、Erlang reference manualのセクション6.18/6.19を参照してください。

+2

としてそれをマークしてください。あなたが*すべての例外を捕まえたいと思っているのでなければ、おそらくそれは望んでいないでしょう。いくつかのバグを見つけにくくすることができます。 –

+1

@Adam Lindberg:ありがとう - それはdownvotesを説明するでしょう。私は私の答えを編集します。 –

+0

皆さん、ありがとう! :) – Francesco

4

あなたの質問に対する答えは:

io:format("Backtrace ~p~n", [erlang:get_stacktrace()]) 

現在の関数は、リストの先頭にあります。 man 3erl erlangまたはerlang:get_stacktrace/0

関連する問題