Exception Handling
异常处理
例外情况在begin
/ end
块中获救:
begin
# code that might raise
rescue
# handle exception
end
如果你在一个方法中,你不需要使用,begin
或者end
你想限制解救异常的范围:
def my_method
# ...
rescue
# ...
end
class
或module
也是如此。
您可以通过=> variable_name在行尾使用将异常分配给本地变量rescue:
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
例外与从顶部开始的救援部分相匹配,并且仅匹配一次。如果在开始部分引发了一个 ArgumentError,它将不会在 StandardError 部分中处理。
您可以重试获救的例外情况:
begin
# ...
rescue
# do something that may change the result of the begin block
retry
end
执行将在开始块的开始处恢复,因此小心不要创建无限循环。
在救援块内部是唯一有效位置retry
,所有其他用途将引发 SyntaxError。如果你想重试块迭代使用redo
。详细信息请参阅控制表达式。
无论是否引发异常,都要运行一些代码,请使用ensure
:
begin
# ...
rescue
# ...
ensure
# this always runs
end
当没有引发异常时,您也可以运行一些代码:
begin
# ...
rescue
# ...
else
# this runs only when no exception was raised
ensure
# ...
end