Ruby泛型捕获所有错误

时间:2018-03-19 15:03:57

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

你正在寻找这样的东西吗? 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

答案 1 :(得分: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 )(包括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"