【问题标题】:Ruby generic catch all errorRuby 通用捕获所有错误
【发布时间】:2018-08-28 04:44:52
【问题描述】:

有没有办法捕捉 Ruby/Rails 遇到的任何类型的错误?

我正在发出网络请求。到目前为止我看到的是,它可以返回 404、超时甚至任何空响应对象?

我已经单独处理了它们,它不是 DRY,但是有没有办法优雅地处理所有这些以及我还没有看到的那些?

很多时候,即使分析响应对象,有时它也可能不包含我要查找的内容。当然,我可以单独处理它们。
我很想知道是否可以定义一个用例来使用,除了它之外的所有东西,我没有想到,只是抛出一个异常并且不会破坏我的应用程序。

在 Ruby 中是否可以进行通用错误处理?

【问题讨论】:

  • 使用Better Errors之类的东西不是更好吗?
  • @SRack,我也使用 Better Errors,但我相信 OP 正在寻求处理来自网络外部的请求?
  • 干杯达里尔,有道理。另外,这里值得一读:stackoverflow.com/questions/10048173/…
  • @SRack 在 BetterErrors 中有一个警告,它不鼓励在生产中使用它。我真的不想为此烦恼。但我不知道 BetterErrors。所以谢谢。

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


【解决方案1】:

是的,这绝对是可能的,Ruby 中有几个不同级别的异常救援,正如 Daryll 所指出的,您可以指定不同的异常去同一个处理程序,例如

begin
  # potentially exception raising code
rescue Exception1, Exception2 => e
  # run code if Exception1 or Exception2 get raised
end

您还可以捕获 StandardError,您希望捕获的大多数异常都继承自该错误。如果您正在寻找一个包罗万象的方法,这是一个不错的选择,比如试试这个,无论如何都要坚持下去。

begin
  # potentially exception raising code
rescue StandardError => e
  # run code if StandardError or anything that inherits from StandardError is raised (most errors)
end

您还可以捕获 Exception (Dangerous),每个 Exception 都继承自(包括 StandardError)。您几乎永远不想这样做,因为诸如 SyntaxErrors、SignalExceptions(您可以捕获 Control-C 并防止用它终止您的脚本)和其他内部错误也继承自 Exception。有关更多详细信息,请参阅http://blog.honeybadger.io/ruby-exception-vs-standarderror-whats-the-difference/

begin
  syntax exception
rescue => e
  puts "I even catch syntax errors!!!"
end
puts "I'll keep on executing though"

【讨论】:

  • 我已经尝试过这些,但它们没有捕捉到 Gem 特定的错误。必须为每个类定义。
  • 啊。对不起。有一个错字。所以最好的办法是提高StandradError。这应该给一些想法,对吧?
  • 是的,我会说拯救 StandardError 可能是您想要的。如果是我,我仍然会分别处理异常与空/错误响应,因为如果出现错误,您将无法通过响应。尽管如果我有相同的逻辑,无论是否有错误或空响应,我都会将其放入一个方法中,并在救援中以及当您在响应中找不到您要查找的内容时调用它们跨度>
【解决方案2】:

您正在寻找这样的东西吗? Source.

begin
  rand(2) == 0 ? ([] + '') : (foo)
rescue TypeError, NameError => e
  puts "oops: #{e.message}"
end

如果您希望在控制器中实现这些功能,并希望将其干燥,请尝试可恢复的。 Ruby API link.

class ApplicationController < ActionController::Base
  rescue_from User::NotAuthorized, with: :deny_access # self defined exception
  rescue_from ActiveRecord::RecordInvalid, with: :show_errors

  rescue_from 'MyAppError::Base' do |exception|
    render xml: exception, status: 500
  end

  private
    def deny_access
      ...
    end

    def show_errors(exception)
      exception.record.new_record? ? ...
    end
end

【讨论】:

  • 不错。值得在获救的人中添加StandardError 以便全面吗?
  • 基于this article,是默认的:)
  • 啊,很方便。干杯@DaryllSantos。 +1
  • 在您链接的 SO 中,其中一个 cmets 建议最好从 Gem 特定类中解救出来。这不是不可维护吗?
  • 另外,独立 Ruby 是否有一种 DRY 方式来执行这些操作?
猜你喜欢
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2012-04-14
相关资源
最近更新 更多