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"
有没有办法捕获 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"