2012-05-09 135 views
4

是否可以爲任何未處理的異常定義異常處理程序?將我的整個代碼塊包裹在開始/救援/結束塊中感覺混亂。爲未處理的異常註冊處理程序

+0

嗯,代碼可能會引發異常的任何地方的感覺太雜亂,不是嗎? – maerics

+0

@maerics在某些情況下,我想是這樣想的,但想象一下,如果您需要在守護進程中捕獲未處理的異常(讀取:錯誤),並將其自行關閉併發送通知。 – Matty

+0

我認爲在開始/營救結束時包裝你的整個代碼是一種方式,不應該感到混亂。把真正的工作歸因於它自己的方法,所以你只需要一個'主要'方法來包裝或者其他東西。開始; 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

這就是我最初的實現方式,但是我對$的價值做了一個錯誤的假設!並忽略了這種想法,必須有更好的方法。這是正確的解決方案,雖然有必要在'$!'上調用kind_of?來檢查異常是否是'SystemExit',因爲調用'exit'的結果。 – Matty