当我从[门卫]中引发异常时,异常会在门卫内处理(很明显)。
文件路径 vendor/gems/doorkeeper-2.2.0/lib/doorkeeper/errors.rb
我在 base_controller 中处理其他异常。是否可以在 base_controller 中而不是在插件/ gem门卫中处理异常?
答案 0 :(得分:1)
异常通过调用堆栈从它们被引发的点“冒泡”,直到它们被捕获(通常是rescue
块)。一旦捕获到异常,它就会停止冒泡并且在调用堆栈中没有检测到它。因此,如果gem在内部处理此异常,则无法在堆栈的上方听到它(例如,在调用gem的BaseController中)。
但是,通常我不希望宝石拯救每个异常;我希望它只能挽救它所期望的异常类型,并且完全了解如何在内部处理。当它拯救一个例外时,基本上宝石就是说“我知道这个例外是什么,它来自哪里,它为什么会发生,以及它应该采取什么措施。我完全有信心能够处理所有影响这个例外并没有人需要知道它。“如果无法做出这种保证,那么首先不应该豁免该例外。
也许不是异常,gem会传递一些错误代码或状态标志来指示出错的地方?如果是这样,您可以在BaseController中使用它。否则,我认为你应该相信gem能够完成它的工作(或者如果你不信任它,那么找一个替代方案)。
答案 1 :(得分:1)
Ruby具有猴子修补类的功能,即使它们在模块中,但我从未见过它适用于错误。错误没有属性或方法,因此无需扩展。由于门卫错误文件看起来像这样
module Doorkeeper
module Errors
class DoorkeeperError < StandardError
end
class InvalidAuthorizationStrategy < DoorkeeperError
end
class InvalidTokenStrategy < DoorkeeperError
end
class MissingRequestStrategy < DoorkeeperError
end
end
end
你可以随时拯救并重新处理错误,如果你想做一些自定义的事情,不应该成为一个问题。
def raise_and_rescue
begin
puts 'I am before the raise.'
raise Doorkeeper::Errors::InvalidAuthorizationStrategy
puts 'I am after the raise.'
rescue
puts 'I am rescued.'
end
end
p raise_and_rescue