【问题标题】:How to manually create exception with message and backtrace如何使用消息和回溯手动创建异常
【发布时间】:2016-09-05 05:30:13
【问题描述】:

如何使用回溯创建异常?

我知道我们可以这样做来实现这一目标:

begin
  raise StandardError, "message"
rescue StandardError => exception
  exception.backtrace
end

或者

exception = StandardError.new("message")
exception.set_backtrace(caller)

但我正在寻找这样的东西:

exception = StandardError.new("message", backtrace: caller)

有没有一种方法可以使用自定义消息和回溯来初始化异常?

【问题讨论】:

    标签: ruby exception


    【解决方案1】:

    您不能使用回溯来初始化异常,但您可以在初始化后立即分配一个。

    exception = StandardError.new("message")
    exception.set_backtrace(caller)
    

    【讨论】:

      【解决方案2】:

      自己封装一个函数类:

      class ErrorCreator
        def self.new(error, message = nil, backtrace: caller)
          exception = error.new(message)
          exception.set_backtrace(backtrace)
          exception
        end
      end
      

      用途:

      ErrorCreator.new(StandardError, "failed")
      ErrorCreator.new(StandardError, "failed", backtrace: caller)
      

      我创建了一个 gem 供任何人使用:https://github.com/JuanitoFatas/active_error

      【讨论】:

        【解决方案3】:

        您可以像这样创建自己的异常:

        app > exceptions > name_exception.rb中创建一个文件

        name_exception.rb

        class NameException < StandardError
          def initialize(message, backtrace)
            super
            backtrace
          end
        end
        

        然后在你的文件中

        raise NameException.new(message, backtrace)
        

        您可以根据自己的需要调整它,但模式就在这里。

        【讨论】:

          【解决方案4】:

          根据其他答案,您需要在错误对象上使用set_backtrace。但是您可以在自定义错误的初始化方法中执行此操作,如下所示:

          class MyError < StandardError
            def initialize(message, backtrace)
              super(message)
              set_backtrace backtrace
            end
          end
          

          通过这种方式,您可以将所有逻辑封装在一个类中,而无需错误工厂。

          【讨论】:

            猜你喜欢
            • 2020-12-09
            • 2010-11-01
            • 2021-06-23
            • 2020-11-02
            • 1970-01-01
            • 2014-12-22
            • 1970-01-01
            • 1970-01-01
            • 2012-07-10
            相关资源
            最近更新 更多