【问题标题】:Ruby on Rails exception handling basicsRuby on Rails 异常处理基础知识
【发布时间】:2013-01-21 01:12:06
【问题描述】:

我有一个 Rails 3 应用程序,它使用 exception_notification gem 发送有关异常的电子邮件。

我还想在发生异常时向用户显示特定的错误消息,但是通过捕获通用异常,因为我不确定可能发生的所有异常。我在想这样做的方法是从异常中拯救出来,然后引发一个自定义异常。这样我仍然会收到有关异常的电子邮件,并且用户可以看到自定义异常的错误页面。

这听起来像 Rails 3 的做事方式吗?

非常感谢。

【问题讨论】:

    标签: ruby-on-rails-3 exception-handling exception-notification


    【解决方案1】:

    我认为不会。

    正如瑞恩戴维斯所说

    不要拯救异常。曾经。否则我会捅你一刀。

    有关该声明的更多信息here

    Rails 3.2 在两个中间件中进行异常处理:

    • ActionDispatch::ShowExceptions
    • ActionDispatch::DebugExceptions

    你可以通过运行来检查那个

    $ rake middleware 
    

    ActionDispatch::ShowExceptions [source]

    在生产中用于呈现异常页面。

    ActionDispatch::DebugExceptions [source]

    在开发环境中用于在发生异常时呈现详细的堆栈跟踪。如果action_dispatch.show_detailed_exceptions 更准确,则停止中间件调用链并呈现堆栈跟踪。


    因此,使用此中间件进行正常操作的最简单方法是猴子修补 ActionDispatch::DebugExceptionscall 方法,完成您需要做的所有事情,然后调用原始方法。

    不过,更好的方法是在这两者之间添加您自己的中间件。在其中,您可以将调用包装在救援块中并进行自定义处理。

    我是Airbrake 的维护者,这正是what we're doing right now

    您可能还想查看Errbit,这是自托管的替代方案。

    【讨论】:

    • 感谢您的详细解答。如果我只是捕获了 StandardError,然后引发了一个自定义异常并在 ApplicationController 中处理它,那可以吗?谢谢!
    • 好吧,如果你想在你的控制器中使用rescue_from,你总是可以在你的控制器中使用它。 check this answer
    • 再次感谢。但是,如果我在控制器中捕获它并且不让它一直到达应用程序控制器,我认为 exception_notification gem 不会知道抛出了异常。
    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多