如何在 ruby​​ on rails 中结合救援多个异常?

Posted

技术标签:

【中文标题】如何在 ruby​​ on rails 中结合救援多个异常?【英文标题】:how to combine rescue multiple exceptions in 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 - 我试过了,但不确定异常的顺序在这里是否重要。 当您有多个救援块(您的第一个代码块)时,顺序很重要,因为一旦匹配,您就会执行该块并完成,因此您希望在更通用的父类之上有更具体的子类。当将它们移动到单行(一个救援块)时,顺序无关紧要:只能引发一个异常,如果它们匹配,它们都会汇集到该块中) 【参考方案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)

【讨论】:

以上是关于如何在 ruby​​ on rails 中结合救援多个异常?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails Tutorial 第二章

ruby on rails如何安装

如何在 ruby​​ on rails 中命名外键?

Ruby on Rails - 如何在 Rails 方法中使用 HTML 坐标?

如何在 ruby​​ on rails 中发布数据

Ruby on Rails 模式 - 装饰器与演示器