处理异常
使用 begin/rescue
块来捕获(救援)异常并处理它:
begin
# an execution that may fail
rescue
# something to execute in case of failure
end
rescue
子句类似于 C#或 Java 等大括号语言中的 catch
块。
像这样的裸露的 rescue
救了 StandardError
。
注意:注意避免捕捉 Exception
而不是默认的 StandardError
。Exception
类包括 SystemExit
和 NoMemoryError
以及你通常不想捕获的其他严重异常。始终考虑捕捉 StandardError
(默认值)。
你还可以指定应该获救的异常类:
begin
# an excecution that may fail
rescue CustomError
# something to execute in case of CustomError
# or descendant
end
这个救援条款不会发现任何不是非法的例外 12。
你还可以将异常存储在特定变量中:
begin
# an excecution that may fail
rescue CustomError => error
# error contains the exception
puts error.message # provide human-readable details about what went wrong.
puts error.backtrace.inspect # return an array of strings that represent the call stack
end
如果你未能处理异常,你可以随时在救援区中提起异常。
begin
#here goes your code
rescue => e
#failed to handle
raise e
end
如果你想重试你的 begin
块,请致电 retry
:
begin
#here goes your code
rescue StandardError => e
#for some reason you want to retry you code
retry
end
如果在每次重试中都捕获异常,则可能会陷入循环。要避免这种情况,请将 retry_count
限制为一定次数。
retry_count = 0
begin
# an excecution that may fail
rescue
if retry_count < 5
retry_count = retry_count + 1
retry
else
#retry limit exceeds, do something else
end
你还可以提供 else
街区或 ensure
街区。当 begin
块完成而没有抛出异常时,将执行 else
块。始终会执行 ensure
块。ensure
块类似于使用 C#或 Java 等大括号语言的 finally
块。
begin
# an execution that may fail
rescue
# something to execute in case of failure
else
# something to execute in case of success
ensure
# something to always execute
end
如果你在 def
,module
或 class
块中,则不需要使用 begin 语句。
def foo
...
rescue
...
end