有没有办法捕获Ruby / Rails遇到的任何类型的错误?
我正在发网络请求。到目前为止我看到的是,它可以返回404,超时甚至是空响应对象吗?
我已经单独处理了它们,它不是DRY,但有没有办法处理所有这些以及那些我还没有看到过优雅的东西?
即使在分析响应对象时,很多时候,它有时也可能不包含我要查找的内容。当然我可以单独处理它们 我很想知道是否可以定义一个用例来处理,除了它之外的所有东西,我都没有想到,只是抛出异常并且不会破坏我的应用程序。
Ruby中是否可以进行通用错误处理?
答案 0 :(得分:1)
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"