如何从rails中的插件引发异常

时间:2015-04-30 14:34:50

标签: ruby-on-rails doorkeeper

当我从[门卫]中引发异常时,异常会在门卫内处理(很明显)。

文件路径 vendor/gems/doorkeeper-2.2.0/lib/doorkeeper/errors.rb

我在 base_controller 中处理其他异常。是否可以在 base_controller 中而不是在插件/ gem门卫中处理异常?

2 个答案:

答案 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