【发布时间】:2015-04-30 14:34:49
【问题描述】:
当我从 [doorkeeper] 中引发异常时,异常会在 doorkeeper 中得到处理(这很明显)。
文件路径 vendor/gems/doorkeeper-2.2.0/lib/doorkeeper/errors.rb
我在 base_controller 中处理我的其他异常。是否可以在 base_controller 中而不是在插件/gem 门卫中处理异常?
【问题讨论】:
当我从 [doorkeeper] 中引发异常时,异常会在 doorkeeper 中得到处理(这很明显)。
文件路径 vendor/gems/doorkeeper-2.2.0/lib/doorkeeper/errors.rb
我在 base_controller 中处理我的其他异常。是否可以在 base_controller 中而不是在插件/gem 门卫中处理异常?
【问题讨论】:
异常从引发点通过调用堆栈“冒泡”,直到它们被捕获(通常被rescue 块捕获)。一旦捕获到异常,它就会停止冒泡,并且不会在调用堆栈中检测到它。因此,如果 gem 在内部处理此异常,您将无法在堆栈的更高位置听到它(例如,在调用 gem 的 BaseController 中)。
但是,通常我不会期望 gem 来拯救每个异常;我希望它只能挽救它期望并完全知道如何在内部处理的异常类型。当它挽救一个异常时,gem 本质上是在说“我知道这个异常是什么,它来自哪里,为什么会发生,以及应该如何处理它。我 100% 有信心我可以处理所有的影响这个例外,其他人甚至不需要知道它。”如果不能做出这种保证,那么一开始就不应该挽救异常。
也许不是异常,gem 会传递某种错误代码或状态标志来指示出现问题?如果是这样,您可以在 BaseController 中使用它。否则,我认为您应该只信任 gem 来完成它的工作(或者如果您不信任它,请寻找替代方案)。
【讨论】:
Ruby 具有猴子修补类的能力,即使它们在模块中,但我从未见过它应用于错误。错误没有属性或方法,因此无需扩展。由于 Doorkeeper 错误文件是这样的
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
【讨论】:
{error, message, error code and a custom error code 之类的格式,因此我很难在 GEM 中注入自定义错误代码。我想要一个通用代码。