處理異常

使用 begin/rescue 塊來捕獲(救援)異常並處理它:

begin
  # an execution that may fail
rescue
  # something to execute in case of failure
end

rescue 子句類似於 C#或 Java 等大括號語言中的 catch 塊。

像這樣的裸露的 rescue 救了 StandardError

注意:注意避免捕捉 Exception 而不是預設的 StandardErrorException 類包括 SystemExitNoMemoryError 以及你通常不想捕獲的其他嚴重異常。始終考慮捕捉 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

如果你在 defmoduleclass 塊中,則不需要使用 begin 語句。

def foo
    ...
rescue
    ...
end