2009-08-10 87 views
8

在Java中,我偶爾會直接拋出一個AssertionError來斷言無法達到某一行。這方面的一個例子是斷言無法到達switch聲明中的default個案(例如,參見this JavaSpecialists page)。.Net相當於Java的AssertionError

我想在.Net中使用類似的機制。是否有可以使用的等價異常?還是有另一種方法可以用於相同的效果?爲了說明問題,我正在尋找一種機制,在運行時在發佈的代碼中標記失敗,以指示代碼中的某個不變量(可能是災難性的)失敗。鏈接的例子生成一個介於0和2之間的隨機整數(包括0和2),並聲明生成的數字總是0,1或2.如果這個斷言不成立,最好是完全停止執行,而不是繼續執行一些未知的系統的腐敗狀態。

回答

8

根據價值的來源,我通常會拋出InvalidOperationExceptionArgumentOutOfRangeException

另外,還有Debug.Assert(當你有定義的DEBUG預處理符號這隻會失敗),或在.NET 4.0中,你可以使用Contract.FailContract.AssertContract.Assume視情況而定。顯式拋出異常有一個好處,即編譯器知道下一個語句不可訪問。

我不是Debug.Assert的粉絲 - 它通常不適合發佈(因爲它拋出了斷言框而不是失敗),默認情況下它不會在發佈中觸發。我更喜歡總是拋出的異常,因爲它們會阻止您的代碼繼續執行,無論是在發現「原因錯誤」的機會之後。

代碼合同有點改變了遊戲,因爲在執行時有各種各樣的選項可供選擇,而靜態檢查程序可以幫助證明您不會進入該狀態。您仍然需要選擇,雖然執行時間的政策......

1

可以使用Trace.Assert方法,這將在發行工作中產生(如果您已經定義了TRACE編譯符號,它在默認情況下Visual Studio項目定義) 。您還可以通過TraceListener自定義應用程序對斷言錯誤的反應方式。默認情況下(不出意外)DefaultTraceListener,如果應用程序在交互模式下運行,它將在對話框中顯示斷言。例如,如果您想拋出異常,則可以創建自己的TraceListener並將其投入方法Fail。然後,您可以刪除DefaultTraceListener並使用您自己的,或者programmaticallyconfiguration file

這看起來很麻煩,而且只有在您想要動態改變應用程序通過跟蹤偵聽器處理斷言的方式時纔是合理的。對於您始終想要失敗的違規行爲,請創建您自己的AssertionException課程並立即將其扔掉。

對於.NET 4.0,我會定義一下Contract.Assert方法。但是,只有在定義符號DEBUGCONTRACTS_FULL時才編譯此方法。 DEBUG將無法​​在發佈版本上工作,並且CONTRACTS_FULL也會啓用所有其他合同檢查,其中一些可能不希望出現在發佈版本中。