2009-07-10 51 views
3

以下哪一種處理這種先決條件的方法更可取,更重要的是什麼?處理典型先決條件異常的最佳方法?

1:

If Not Exists(File) Then 
    ThrowException 
    Exit 
End If 
File.Open 
...work on file... 

2:

If Exists(File) Then 
    File.Open 
    ....work on file... 
Else 
    ThrowException 
    Exit 
End 

注:該文件存在確認僅僅是一個先決條件來處理的一個例子。顯然,讓File存在檢查向上拋出它們自己的異常是一個很好的例子。

+3

數字3:讓File.Open拋出異常? – balpha 2009-07-10 20:50:42

回答

1

這是一種風格的東西。兩者都能很好地工作,但是我更喜歡選項1.我想盡快退出我的方法,並且已經完成所有檢查。

4

我更喜歡第一種變體,因此更好的文檔前提

1

可讀性第一種方法是比第二高。
如果你有幾個先決條件來檢查,第二個選項可以相當快地嵌套;此外,它表明if/else在正常流程中處於某種程度,而它只是針對特殊情況。

同樣,第一種方法的表達性因此高於第二種方法。
正如我們在談論的先決條件,他們應該在程序開始時進行檢查,以確保合同得到尊重;出於這個原因,整個檢查應該與程序的其餘部分分開。

由於這兩個原因,我肯定會選擇第一個選項。


注意:我在這裏談論的前提條件:我希望你的函數的合同明確規定的文件作爲現有的,因此沒有這將是編程錯誤的跡象。否則,如果我們只是在討論異常處理,那麼我只需將它留給File.Open,只有在有關如何繼續處理該異常的想法時才處理該異常。

1

每個例外都必須在適當的級別生成。在這種情況下,您的異常是open()問題,由open()調用處理。因此,你不應該添加異常代碼到你的例程中,因爲你會複製東西。除非:

  1. 你想抽象你的IO後端(比如你的高級例程可以使用文件打開,但也可以在將來使用MySQL)。在這種情況下,如果出現IO問題,客戶端代碼將更好地瞭解更多標準和唯一的異常。
  2. 低級別異常的存在意味着高級別語義的高級異常(例如,不能夠打開一個密碼文件意味着沒有權威性是可能的,因此,你應該提出類似UnableToAuthenticateException)

至於編碼您2箱子的風格,我肯定會去的第一個。我討厭很長的代碼塊,特別是在ifs之下。他們也傾向於嵌套,如果您選擇第二種策略,您將最終縮進太多。

2

將前置條件檢查與工作分開只有在兩者之間沒有任何變化時纔有效。在這種情況下,外部事件可能會在您打開文件之前刪除該文件。因此,對文件存在的檢查沒有什麼價值,公開調用必須檢查這個,讓它產生異常。

1

真正前提的東西,如果發生,是在調用者情況錯誤:你的設計在一定條件下的功能,但他們都堅持不住,所以調用者不應該調用這些函數數據。

如果文件是必需的並且它的存在之前在代碼的另一部分中檢查過,則您沒有找到文件的情況可能是這樣的;然而,這並不如此,因爲djna表示:文件刪除或網絡故障可能會導致錯誤在您打開文件時發生。

然後最常見的處理方法是嘗試打開文件,並在失敗時拋出異常。然後,假設沒有拋出異常,繼續正常工作。