如何捕捉ruby中的所有异常?

问题描述:

我们如何捕获或/和处理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*/  
} 

我们怎样才能做到这一点与红宝石?

在Ruby中,您可以将程序包装在begin/rescue/end区块中。任何未处理的异常都会冒泡到该块并在那里处理。

+0

即使我们有从另一个文件或第三方库引发的异常,这是否正常工作? – GarouDan

+1

是的,它即使那样。 – eiko

+0

这个不清楚。 –

先进的解决方案使用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://*.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby)。你可以提到为什么它通常是一个坏主意。 –

+0

感谢您的评论,我还没有意识到这一点。 – w1t3k

+0

没问题。 “救援例外”就像在火警上放置一个贪睡按钮。你可以做到,但你可能不应该;) –