2016-02-02 81 views
1

斷言。我正在使用的代碼斷言驗證的假設,並拋出給我很好的消息,像這樣:斷言在代碼 - 在嘗試捕捉

int IntegerDivide (int dividend , int divisor) 
{ 
    Debug.Assert (divisor != 0); 
    return (dividend/divisor); 
} 

(來自爲例Assertions in Managed Code)。

現在我只是想知道是否可以使用它來檢查不應該拋出異常的代碼。像這樣的東西可以做到:

try 
{ 
    //code 
} 
catch (exceptionThatShouldntHappen ex) 
{ 
    Debug.Assert(false,"This exception should never happen!") 
} 

這樣做了嗎?我的意思是,顯然只有有例外的代碼纔有意義,否則它就會崩潰。但這是關鍵,你可以想象調用代碼將會捕捉到各種各樣的異常,但有些並不意味着會發生。無論調用者如何捕捉它們,您都要確保這些異常總是會中斷,以免在調試中。

我會去更詳細的例子:假設我有一個數據訪問類 類。它可以拋出各種例外。

調用代碼因此會捕獲異常。有時(或大多數時間?),調用代碼將不會有足夠的信息,或在意, 可能有哪些例外。我的意思是,無論如何,失敗的FindRecord()。你趕上 並返回一個錯誤頁面或消息,甚至回退。

但在數據訪問邏輯中,應該不會發生一些錯誤(假設文件未被發現,如果該文件被假定爲在之前被檢查過)。那是什麼時候發生的。你斷言,所以無論上游代碼如何捕獲異常,它在調試過程中都會中斷 - 這是什麼斷言。

最後,如果這種做法有意義,我想知道什麼是最好的方法來做到這一點。在整個地方添加try-catch必須有很大的影響(對於沒有嘗試捕捉的方法)。 #if DEBUG圍繞try-catch看起來醜陋地獄。

+0

雖然不同的語言,他們基本上是一樣的問題。核心思想:只是忽略它 - 如果拋出異常,測試會自動失敗。 –

+0

@JeroenVannevel關鍵是'Debug.Assert'會導致調試器斷言斷言失敗(處理異常通常*不*斷開) – Rob

+0

@Rob然後在調試模式下執行測試..我錯過了什麼嗎? –

回答

1

有沒有必要做try...catch,拋出的任何異常會冒出來,直到有人處理它們。

catch中的Debug.Assert只會在調試模式下引發異常。大多數情況下,您可以讓調試器中斷異常。

你應該對不變量使用斷言,並且讓其他異常被引發,直到需要處理它們。

在你的情況,我不認爲你有什麼想要處理異常。

這可能是更好的具體ArgumentException取代Debug.Assert,這種方式在發佈模式的異常更有用,但在你的例子中,它既不在這裏也不在那裏。

+0

的確如此,但手頭的情況恰恰是當你不想讓調用代碼捕獲特定的異常時,因爲它被假定爲永遠不會發生......當然,如果調用代碼對於捕獲什麼異常一絲不苟,那會不是一個問題。 – RSinohara

+0

但是,如果它永遠不會發生,爲什麼要詳細說明如果它發生什麼應該發生?我對「這永遠不會發生」的迴應永遠是「好的,那麼我就會崩潰」。無論如何,人們立即迴應「不,我們不能這樣做」,在這種情況下,你知道它有時會發生,因此保證更好的處理。還要考慮大數的定律。如果你認爲「這將在10000次發生1次」。如果你有一百萬用戶,那麼很可能有100人正在遇到它。 –