2017-02-03 32 views
2

我們如何捕獲或/和處理ruby中所有未處理的異常?例如,爲此的動機可能是記錄某種例外情況給不同的文件,或者發送和發送給系統管理員。如何捕捉ruby中的所有異常?

在Java中,我們會做

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex); 

的NodeJS
process.on('uncaughtException', function(error) { 
    /*code*/ 
}); 

在PHP

register_shutdown_function('errorHandler'); 

function errorHandler() { 
    $error = error_get_last(); 
    /*code*/  
} 

我們怎樣才能做到這一點與紅寶石?

回答

3

在Ruby中,您可以將程序包裝在begin/rescue/end區塊中。任何未處理的異常都會冒泡到該塊並在那裏處理。

+0

即使我們有從另一個文件或第三方庫引發的異常,這是否正常工作? – GarouDan

+1

是的,它即使那樣。 – eiko

+0

這個不清楚。 –

4

先進的解決方案使用exception_handler gem

如果你只想捕獲所有異常並把例如在日誌中,您可以添加以下代碼ApplicationController

begin 
    # do something dodgy 
rescue ActiveRecord::RecordNotFound 
    # handle not found error 
rescue ActiveRecord::ActiveRecordError 
    # handle other ActiveRecord errors 
rescue # StandardError 
    # handle most other errors 
rescue Exception 
    # handle everything else 
end 

更多細節,你可以找到在這thread

+0

'救援例外'是真的[重手](http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby)。你可以提到爲什麼它通常是一個壞主意。 –

+0

感謝您的評論,我還沒有意識到這一點。 – w1t3k

+0

沒問題。 「救援例外」就像在火警上放置一個貪睡按鈕。你可以做到,但你可能不應該;) –