Ruby 通用捕获所有错误

Ruby generic catch all error

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

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

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

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

是否可以在 Ruby 中进行一般错误处理?

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

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

如果你想在控制器中实现这些东西,并想干掉它,试试 rescuable。 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

是的,这绝对有可能,在 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

您还可以捕获异常(危险),每个异常都继承自该异常(包括 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"