如何在Ruby on Rails中合并和处理多个异常?

4
在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

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

3

这个方案可行。你需要考虑未来代码变化的方式和频率,以及这种格式是否有利于变化。

如果可以用测试复现相应的行为,写下代码并查看结果也是不错的选择,尤其是在rails控制台中。那里可能会有更快的反馈循环。


2

您不需要为这些情况添加单独的异常处理,因为ArgumentErrorNameError都属于StandardError

下面是异常处理的层次结构图。

- 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接