處理異常
使用 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