Ruby 使用手冊

例外處理:確認 Exception processing: ensure

方法完成工作後,可能需要作出一些清理動作, 像是關閉打開的檔案;清理緩衝的資料等。如果每個方法都只有一個退出點 (exit point),我們就可以把清理的程式碼放於一個地方,也能確定它會執行工作。但是,一個方法可能從不同地方傳回,或因為例外,使我們的清理程式碼意外跳過 (skip)。

begin
  file = open("/tmp/some_file", "w")
  # ... 寫入檔案 ...
  file.close
end

上述例子中,如果在寫入檔案的程式碼部分出現例外,該檔案就會保持打開。而我們並不想依靠這種冗餘 (redundancy):

begin
  file = open("/tmp/some_file", "w")
  # ... 寫入檔案 ...
  file.close
rescue
  file.close
  fail # 喚起一個例外
end

這很累贅,而且我們要處理所有 returnbreak,所以一旦程式碼變得複雜,就會難以控制。

因此,我們把 ensure 這個關鍵詞加入 "begin...rescue...end" 方案 (scheme)。無論 begin 區塊成功或失敗,ensure 程式碼區塊都會執行。

begin
  file = open("/tmp/some_file", "w")
  # ... 寫入檔案 ...
rescue
  # ... 處理例外 ...
ensure
  file.close   # ... 這總是會發生的。
end

可以在不使用 rescue 的情況下使用 ensure,反之亦然,但如果在相同的 begin...end 區塊中使用,rescue 必須寫於 ensure 之前。

Copyright (c) 2005-2008 Mark Slagell,中文翻譯 Ruby Taiwan 社群

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

A copy of the license is included in the section entitled "GNU Free Documentation License."