【问题标题】:how to combine rescue multiple exceptions in ruby on rails?如何在 ruby​​ on rails 中结合救援多个异常?
【发布时间】:2020-08-26 12:15:34
【问题描述】:

是否可以在 ruby​​ on rails 中将多个救援语句合并为一个。

begin
   //do something 
  rescue ArgumentError => e
      e.message
  rescue NameError => e
      e.message
  rescue StandardError => e
      e.message
end

结合到下面的东西

rescue ArgumentError, NameError, StandardError => e
      e.message

【问题讨论】:

  • 是的,和你的假设rescue ArgumentError, NameError, StandardError => e完全一样。您是否尝试过运行它并遇到您想要询问的某种问题?
  • @SimpleLime - 我试过了,但不确定异常的顺序在这里是否重要。
  • 当您有多个救援块(您的第一个代码块)时,顺序很重要,因为一旦匹配,您就会执行该块并完成,因此您希望在更通用的父类之上有更具体的子类。当将它们移动到单行(一个救援块)时,顺序无关紧要:只能引发一个异常,如果它们匹配,它们都会汇集到该块中)

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

这会奏效。您需要考虑将来如何以及是否希望此代码更改,以及此格式是否有利于这种更改。

这也是编写代码并查看会发生什么(特别是如果您可以通过测试重现适当的行为)的良好候选者,即使仅在 rails 控制台中也是如此。您可能会在那里找到更快的反馈循环。

【讨论】:

    【解决方案2】:

    您不想为这些添加单独的例外。因为 ArgumentErrorNameErrorStandardError 之下。

    这是异常层次结构。

    - NoMemoryError
    - ScriptError
        - LoadError
        - NotImplementedError
        - SyntaxError
    - SecurityError
    - SignalException
        - Interrupt
    - StandardError (default for `rescue`)
        - ArgumentError
            - UncaughtThrowError
        - EncodingError
        - FiberError
        - IOError
            - EOFError
        - IndexError
            - KeyError
            - StopIteration
        - LocalJumpError
        - NameError
            - NoMethodError
        - RangeError
            - FloatDomainError
        - RegexpError
        - RuntimeError (default for `raise`)
        - SystemCallError
            - Errno::*
        - ThreadError
        - TypeError
        - ZeroDivisionError
    - SystemExit
    - SystemStackError
    - fatal (impossible to rescue)
    

    【讨论】:

      猜你喜欢
      • 2023-01-13
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 2019-03-28
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多