【问题标题】:How to raise exception from a plugin in rails如何从 Rails 中的插件引发异常
【发布时间】:2015-04-30 14:34:49
【问题描述】:

当我从 [doorkeeper] 中引发异常时,异常会在 doorkeeper 中得到处理(这很明显)。

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

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

【问题讨论】:

    标签: ruby-on-rails doorkeeper


    【解决方案1】:

    异常从引发点通过调用堆栈“冒泡”,直到它们被捕获(通常被rescue 块捕获)。一旦捕获到异常,它就会停止冒泡,并且不会在调用堆栈中检测到它。因此,如果 gem 在内部处理此异常,您将无法在堆栈的更高位置听到它(例如,在调用 gem 的 BaseController 中)。

    但是,通常我不会期望 gem 来拯救每个异常;我希望它只能挽救它期望并完全知道如何在内部处理的异常类型。当它挽救一个异常时,gem 本质上是在说“我知道这个异常是什么,它来自哪里,为什么会发生,以及应该如何处理它。我 100% 有信心我可以处理所有的影响这个例外,其他人甚至不需要知道它。”如果不能做出这种保证,那么一开始就不应该挽救异常。

    也许不是异常,gem 会传递某种错误代码或状态标志来指示出现问题?如果是这样,您可以在 BaseController 中使用它。否则,我认为您应该只信任 gem 来完成它的工作(或者如果您信任它,请寻找替代方案)。

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • 感谢您的回答。与您的建议类似,我已经在 Doorkeeper errors.rb 文件中添加了一个自定义异常并能够成功挽救它,唯一的问题是 Doorkeeper 异常消息格式完全不同,对于在我的基本控制器中处理的所有剩余异常,我具有{error, message, error code and a custom error code 之类的格式,因此我很难在 GEM 中注入自定义错误代码。我想要一个通用代码。
      • 一旦你救援,你可能会在你的基类中包装错误并用你想要的格式重新抛出。
      猜你喜欢
      • 2012-08-22
      • 2015-03-19
      • 2012-11-11
      • 2014-04-04
      • 1970-01-01
      • 2010-12-27
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多