2009-11-10 97 views

回答

13

如果你正在尋找一個值必須,根據定義,相當於一個枚舉值,並且你已經收到了別的東西,那肯定是一個無效的參數。

但現在你必須考慮上下文。

該方法是否是私有的,只能由您的類庫或應用程序的成員訪問?如果是這樣,這是一個編碼錯誤,不應該首先發生。斷言並失敗。

如果,另一方面,它是一個公共或受保護的方法,並且可以通過客戶端佔用您的圖書館進行訪問,你一定要帶一個有意義的消息(最好是一個衆所周知的異常類型)拋出。

重要的是要記住枚舉不在框架中進行範圍檢查。我可以指定一個方法需要一個Environment.SpecialFolder類型的參數;但它會接受的任何 32位整數值。

因此,簡而言之,如果你的方法是大衆消費,是,通過各種手段,扔。如果不是供公衆消費,Assert

+1

+1這麼說。如果意外值來自您自己,請聲明並失敗。另一方面,如果它來自別人使用你的代碼,那麼你應該拋出一個異常並給調用代碼一個恢復的機會。 – 2009-11-10 18:24:07

+2

爲什麼會比投擲更好?也許這種情況是一種罕見的情況,開發人員並沒有觸及它,只有使用Release版本的測試人員(沒有編譯插入Assert)而且錯誤被吞下。吞下錯誤是否更好,不要崩潰但難以調試錯誤的東西,而不是崩潰堆棧跟蹤? – 2009-11-11 00:05:35

+0

另一個問題是,如果您不爲其他公司編寫API,那麼應該在代碼中加入多少錯誤檢查?短代碼是我認爲比代碼更可讀,每個方法的大小由於錯誤檢查而加倍。不是嗎? – 2009-11-11 00:10:51

0

它確實取決於具體的過程,但是,是的,在默認情況下進行響應是一個很好的過程:如果某些東西不應該在那裏。

2

這聽起來像一個合理的選擇。個人而言,我會創建一個新類型的異常(可能是InvalidEnumException或給它一個對支持團隊有意義的名稱)並拋出該異常。

+2

我個人嘗試重用現有的大量異常類型之一。 http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx – Joe 2009-11-10 18:00:44

+0

同意,低調,因爲我不認爲這是一種情況自定義的異常類型。 – 2009-11-10 18:03:25

1

,因爲如果你的代碼達到默認值,你沒有預期它,這意味着東西在你的代碼是不是表現爲你在那裏思考我扔ApplicationException

+0

是不是使用ApplicationException皺眉了? – 2009-11-10 21:05:41

+0

我從來沒有聽說過 – 2009-11-11 09:30:35

0

我想說至少你應該把Debug.Fail()放在那裏。

如果方法無法繼續,您應該拋出異常。但是,如果您想將枚舉值轉換爲字符串表示形式,那麼您可以僅返回一些警告字符串。由於明顯的錯誤,產品不會因用戶而崩潰,可能會有解決方法,每個人都會很開心。

4

也許不是NotImplementedException,但是ArgumentException。這將取決於你在哪裏使用它。

1

這真的取決於你的用例。如果您在集成的早期階段拋出異常,將會很有幫助。你的圖書館的用戶可以立即知道錯誤

0

如果你拋出異常會發生什麼?在什麼情況下執行switch語句?這種情況是否應該發生?它是否應該在運行時發生在生產代碼中?你的單元測試是否覆蓋了這種情況?如果是這樣,也許一個斷言會更好。

0

您應該首先考慮一下,如果您的值超出了已知情況的值,那麼開啓的變量代表什麼?然後,您可以簡單地使用適合實際發生的異常類型。

5

這真的取決於。

  • NotImplementedException就像我todo標記。這意味着稍後有人會完成代碼。但我不認爲這是不應該發生的默認情況。

  • 當您檢查對象的狀態時,您可能會考慮InvalidOperationException。您的方法僅用於處理現有案例。

  • 當您正在區分輸入參數ArgumentException總是合適的。

  • 在其他情況下,我更喜歡NotSupportedException。它略微表明平臺或版本有問題。並且不兼容的代碼版本是在不應該發生切換的默認情況下發生的問題的真正根源。

+0

有趣的答案。你的動機/推理是什麼? – 2011-06-13 14:44:03

+1

@Tim:我更新了我的答案。 – 2011-06-17 07:53:31

+0

優秀的答案,感謝您的更新。我完全同意你怎麼說的。這有助於我在自己的腦海中得到它。 – 2011-06-17 12:28:59