如何捕捉ruby中的所有异常?
我们如何捕获或/和处理ruby中所有未处理的异常?例如,为此的动机可能是记录某种例外情况给不同的文件,或者发送和发送给系统管理员。如何捕捉ruby中的所有异常?
在Java中,我们会做
Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex);
在
的NodeJSprocess.on('uncaughtException', function(error) {
/*code*/
});
在PHP
register_shutdown_function('errorHandler');
function errorHandler() {
$error = error_get_last();
/*code*/
}
我们怎样才能做到这一点与红宝石?
在Ruby中,您可以将程序包装在begin
/rescue
/end
区块中。任何未处理的异常都会冒泡到该块并在那里处理。
先进的解决方案使用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。
'救援例外'是真的[重手](http://*.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby)。你可以提到为什么它通常是一个坏主意。 –
感谢您的评论,我还没有意识到这一点。 – w1t3k
没问题。 “救援例外”就像在火警上放置一个贪睡按钮。你可以做到,但你可能不应该;) –
即使我们有从另一个文件或第三方库引发的异常,这是否正常工作? – GarouDan
是的,它即使那样。 – eiko
这个不清楚。 –