【问题标题】:How to catch base exception class in Ruby on Rails?如何在 Ruby on Rails 中捕获基本异常类?
【发布时间】:2016-10-29 12:14:46
【问题描述】:

我想使用“rescue_from”捕获 REST API 应用程序中的任何 RoR 异常。

rescue_from StandardError do |exception|
  message = Rails.env.production? ? 'API server error' : exception.message
  render json: {status: "Error", message: message}, status: :internal_server_error
end

但它捕获了太多不相关的异常。我只能捕获 RoR 异常吗?这是一个好习惯吗?如果没有,您还有什么可以推荐的?

【问题讨论】:

  • “仅限 RoR 例外”是什么意思。 ZeroDivision 是从错误地尝试计算零个项目的平均值的控制器/模型抛出的,“RoR one”?
  • @mudasobwa:例如路由错误、缺少参数、找不到记录等
  • RecordNotFound 到底是如何特定于 Rails 的?除了 Rails 之外,可能还有一个应用程序完全使用数据库(和 ActiveRecord)。有关路由错误,请参阅ActionControllerError。顺便说一句,您打算如何处理抛出的其他异常?就让你的应用死掉?
  • @mudasobwa:给你更好的解决方案。这就是提出问题的原因。
  • 目前我发现了以下错误:ActiveRecord::RecordNotFound、ActionController::ParameterMissing、ActionController::UnpermittedParameters(响应 :bad_request - 看起来像 API 客户端的错误)任何其他用 StandardError 捕获的东西(响应 :internal_server_error ) 这可以防止应用程序过早死亡。

标签: ruby-on-rails ruby error-handling exception-handling


【解决方案1】:

嗯,你总是可以去获取所有 Rails 异常的详尽列表,但老实说,你的第一步应该是决定你想要从哪些情况中解救出来,以及你想让哪些情况发生灾难性的行为。并非所有异常都应该被捕获。

如果您一心想要捕获所有 Rails 异常,您应该查看您所使用的 Rails 版本的 api 文档,并找到您关心的异常的基类。例如,如果您希望捕获所有 ActiveRecord,您可以从 ActiveRecord::ActiveRecordError 基类中解救出来。

再次,我要强调的是,您应该从另一个方向来解决这个问题 - 不是拯救一切,然后试图将其稀释,而是从最低限度拯救并根据需要添加。

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2013-01-21
    • 1970-01-01
    • 2011-10-17
    • 2021-08-19
    相关资源
    最近更新 更多