2014-10-17 49 views
2

我需要使用C#按需創建致命異常。雖然我已經無意中做了這麼多次,現在我需要,我找不到一個簡單的方法。有意造成致命異常

很容易導致一個空引用錯誤或被零除等,但我需要一些CTD沒有提供繼續選項。

感謝您的幫助。

+6

不應該有一個未處理的'拋出新的異常(「故意錯誤」);'是夠了嗎? – Lennart 2014-10-17 10:49:07

+1

我不明白。什麼是CTD? – 2014-10-17 10:49:12

+1

碰撞到桌面@SonerGönül – Lennart 2014-10-17 10:49:36

回答

9

不要使用異常來實現這一點,它有太多的副作用。包括根本不終止程序,未處理的異常是否結束程序是一個可以更改的CLR策略。這兩者都是由自定義CLR主機提供的,並且仍然由legacyUnhandledExceptionPolicy配置屬性顯示。

立即中止程序,沒有任何事件被解僱和沒有任何清理(包括不運行終結器)的最可靠的方法是Environment.FailFast()

+0

完美,謝謝:) – Panjo 2014-10-17 12:18:15

+0

雖然我的測試資源管理器在Visual Studio 2013中崩潰, 「vstest.executionengine.clr20.exe已停止工作」和「由於執行過程意外退出而導致活動的測試運行中止,請查看執行過程日誌以獲取更多信息,如果日誌未啓用,則啓用日誌並重試「。在這種情況下的例外似乎更溫和。 – 2017-05-11 15:45:21

0

恕我直言,我更喜歡溫和的方法。我創建了一個我稱爲FatalException的自定義異常。 https://docs.microsoft.com/en-us/dotnet/standard/exceptions/how-to-create-user-defined-exceptions。這樣,當我調用拋出FatalException的方法時,我只需要在調用和捕獲(FatalException fe)方面做一個嘗試。我通常會根據需要重新拋出,以回到父窗體,該窗體也具有FatalException異常的最終捕獲,然後記錄它(我使用Log4Net),顯示有關致命情況的原因的消息框,並調用我的重寫Dispose ()方法並正常退出應用程序。顯然,嵌套調用越深,這越困難。額外的工作對我來說是值得的。如果這成爲您的應用程序中的標準,那麼您在遇到它時會理解它,並確保不會破壞它。我把我的自定義異常放在一個DLL庫中。如果您的代碼位於庫中,則此方法仍然有效,因爲異常也位於庫中,它們可以由另一個庫和主應用程序共享。這意味着你的圖書館也可以拋出FatalException,雖然這樣做的原因應該是很少的。