我已經讀了一下,試圖找出何時適當地使用斷言和例外,但仍然有一些我錯過了大圖。可能我只是需要更多的經驗,所以我想帶一些簡單的例子來更好地理解我應該在什麼情況下使用什麼。斷言和例外的適當使用
例1:讓我們從一個無效值的經典情況開始。例如,我有下面的類,在這兩個領域必須爲正:
class Rectangle{
private int height;
private int length;
public int Height{
get => height;
set{
//avoid to put negative heights
}
}
//same thing for length
}
讓我此話,我不是在談論如何在這個例子中處理用戶輸入,因爲我可以做一個簡單的控制流程。雖然,我面臨的想法是,在別的地方可能會出現一些意想不到的錯誤,我希望能夠檢測到這個錯誤,因爲我不想要一個帶有invald值的對象。所以我可以:
- 使用
Debug.Assert
並停止程序,如果發生這種情況,以便我可以糾正可能出現的錯誤。 - 拋出一個
ArgumentOutOfRangeException
基本上做同樣的事情?這感覺不對,所以我應該使用它,只有當我知道我要在某個地方處理它時。雖然,如果我知道在哪裏處理異常,我不應該解決它存在的問題嗎?或者它可能意味着可能發生的事情,但你不能直接在代碼中控制,就像用戶輸入(可以處理,沒有例外,但也許別的東西不能)或加載數據?
問題:我是否明白斷言和例外的含義是正確的?另外,請舉例說明處理例外情況是否有用(因爲是發生前無法控制的情況)?除了我提到的情況之外,我無法弄清楚還有什麼可以發生,但我顯然還是缺乏經驗。
爲了擴展我的問題:我可以想到爲什麼會拋出異常的各種原因,比如NullReferenceException
,IndexOutOfBoundsException
,IO異常如DirectoryNotFoundException
或FileNotFoundException
等等。雖然我無法弄清楚在哪些情況下處理除了簡單地停止程序(在這種情況下,不應該使用斷言?)或給出簡單的問題出現位置之外,它們變得有用。我知道即使這是有用的,例外也意味着將「錯誤」分類並給出如何解決它們的線索。雖然,是一個簡單的消息,真的他們對有用嗎? 這聽起來很腥,所以我會堅持「我從來沒有面對過適當的情況,因爲經驗」的口頭禪。
示例2:現在讓我們來談談用戶輸入,使用第一個示例。正如我所預料的那樣,我不會使用異常來檢查值是否爲正值,因爲這是一個簡單的控制流程。但是如果用戶輸入一個字母會發生什麼?我是否應該在這裏處理例外情況(可能是簡單的ArgumentException
)並在catch
塊中給出消息?或者也可以通過控制流程避免(檢查輸入是否爲int
或類似的東西)?
感謝任何會清除我心有餘悸的人。
沒有一個正確的答案,它完全取決於你有支持系統來處理你的代碼的客戶端程序員錯誤,不知道爲什麼。用戶輸入無效數據並不例外。 –
我知道高度依賴於情況,我只是想弄清楚會出現什麼樣的情況。此外,堅持這個簡單的例子,相反,如果我的意思是驗證值只是爲了檢測代碼中的錯誤,我應該使用'Debug.Assert'。如果我打算實施保存/加載數據,並且加載文件中的某些內容可能會失敗,我可以捕獲它並使用「損壞的數據」消息停止該程序。這種推理是正確的還是我沒有達到斷言和/或例外的目的? – Harnak
其不完整的問題。通過鼓勵(或迫使)他們輸入正確的數據來處理用戶。停止程序時,它可能只是幫助用戶似乎不必要 – ferday