2012-05-09 15 views
4

未処理の例外に対して例外ハンドラを定義することはできますか? begin/rescue/endブロックにコードブロック全体をラップするのは面倒です。未処理の例外のハンドラの登録

+0

うーん、任意の場所のうち、例外をスローする可能性のコードはありません、あまりにも汚い感じていますか? – maerics

+0

@maericsある場合にはそうだと思いますが、きちんとシャットダウンして通知を送信する必要のあるデーモンで、未処理の例外(読み込み:バグ)をキャッチする必要があると想像してください。 – Matty

+0

私はbegin/rescueの終わりにあなたのコード全体をラップすることは行く方法だと思うし、乱雑に感じるべきではありません。実際の作業をそれ自身の方法に因数分解することができます。したがって、ラップするか、何かを行う「主な」方法があります。 '始める。 executeCode();救助 ' – jrochkind

答えて

10

at_exitの使用はいかがですか?例外が発生しても呼び出され、$!を使用して最後の例外をログに記録できます。ここで

は一例です。

at_exit { 
puts "Last exception: (#{$!.inspect})" 
puts "Backtrace: \n#{[email protected]}" 
puts "Exiting..." 
} 

puts "my app..." 
raise "Exception!" 

http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-at_exit

+1

それはもともと私がそれを実装した方法ですが、私は$の価値について悪い仮定をしました!この考え方を見過ごした方が良い方法があるはずです。これは正しい解決法ですが、 'exit! 'の呼び出しの結果として期待される例外が' SystemExit'であるかどうかをチェックするために、 '$!'で 'kind_of?'を呼び出す必要があります。 – Matty