Exception
处理¶ ↑
异常在 begin
/end
块中被捕获
begin # code that might raise rescue # handle exception end
如果您在方法内部,则无需使用 begin
或 end
,除非您希望限制捕获异常的范围
def my_method # ... rescue # ... end
对于 class
、module
和 block
也是如此
[0, 1, 2].map do |i| 10 / i rescue ZeroDivisionError nil end #=> [nil, 10, 5]
您可以通过在 rescue
行末使用 => variable_name
将异常分配给局部变量
begin # ... rescue => exception warn exception.message raise # re-raise the current exception end
默认情况下,StandardError
及其子类会被拯救。您可以通过在 rescue
后列出它们来拯救一组特定的异常类(及其子类)。
begin # ... rescue ArgumentError, NameError # handle ArgumentError or NameError end
您可以通过不同的方式拯救不同类型的异常。
begin # ... rescue ArgumentError # handle ArgumentError rescue NameError # handle NameError rescue # handle any StandardError end
异常将从顶部开始与拯救部分匹配,并且只匹配一次。如果在 begin 部分中引发了 ArgumentError
,则它不会在 StandardError
部分中处理。
您可以重试被拯救的异常。
begin # ... rescue # do something that may change the result of the begin block retry end
执行将从 begin 块的开头恢复,因此请注意不要创建无限循环。
在拯救块内是 retry
的唯一有效位置,所有其他使用都会引发 SyntaxError
。如果您希望重试块迭代,请使用 redo
。有关详细信息,请参阅 控制表达式。
要始终运行一些代码,无论是否引发了异常,请使用 ensure
begin # ... rescue # ... ensure # this always runs end
您也可以在没有引发异常时运行一些代码。
begin # ... rescue # ... else # this runs only when no exception was raised ensure # ... end