【问题标题】:How to catch all exceptions in ruby?如何捕获红宝石中的所有异常?
【发布时间】:2017-06-21 03:30:27
【问题描述】:

我们如何在 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​​ 做到这一点?

【问题讨论】:

    标签: ruby exception exception-handling


    【解决方案1】:

    高级解决方案使用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 中找到更多详细信息。

    【讨论】:

    • rescue Exception 真的是heavy handed。您可以提及为什么这通常是一个坏主意。
    • 感谢您的评论,我还不知道。
    • 没问题。 rescue Exception 就像在火警上放了一个贪睡按钮。你可以这样做,但你可能不应该这样做;)
    • ApplicationController 不是 Rails 的一部分吗?
    【解决方案2】:

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

    【讨论】:

    • 即使我们从另一个文件或第三方库抛出异常,这是否有效?
    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多