如何在 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】:您不想为这些添加单独的例外。因为 ArgumentError 和 NameError 在 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)
【讨论】:
以上是关于如何在 ruby on rails 中结合救援多个异常?的主要内容,如果未能解决你的问题,请参考以下文章