形勢
嗯,你可以看到下面,我有一個主要的應用程序,創建一個線程,它創建了一堆背景的工人。當RunWorkerCompleted被解僱了一些BG工人時,我有時候最終放棄了一個未處理的異常,(因爲我明確指出了一個原因,但這不是問題)。
劫持UnhandledException保持多線程應用程序運行
所以日誌清楚地表明,我的UnhandledException處理程序進入和異常報告。 我知道我故意濫用OnUnhandledException通過使用Console.Read()停止應用程序退出。我特意做了,因爲我想在終止應用之前進行人工干預/檢查。
public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Logger.log("UNHANDLED EXCEPTION : " + e.ExceptionObject.ToString());
Mail.Sendmail("ADMIN ALERT : " + e.ExceptionObject.ToString());
Console.Read(); // Yes, this is an ungraceful trick, I confess.
}
然而,什麼應該僅僅是一個「暫停」之前手動退出橫空出世,以保持應用程序活着,即線程仍在產生工作者和運行若無其事。甚至Weirder:當它再次發生時,UnhandledException仍然不時被刪除。它每次都被記錄下來,表現得就像是一場純粹的嘗試。 (這是NET 3.0之前默認行爲)
問題
那麼,爲什麼發生的一切彷彿UnhandledException沒有拋出,線程和BG的繼續運轉,好像什麼都沒有發生? 我的猜測是是,只要OnUnhandledException處理程序沒有完成,並且應用程序仍然存在,所有仍在運行的運行線程將繼續生活在一個自由的世界中並執行其工作。
這給了我一個不好的誘惑,這是保持這種設計,作爲try/catch to unHandled異常。
我知道這不是一個整潔的想法,因爲你永遠不知道異常是嚴重的還是可以跳過的東西。但是,我真的更喜歡我的程序整天保持運行,並觀察日誌報告/郵件警報,並確定是否需要重新啓動它。 由於這是一個需要24/7全天候運行的服務器應用程序,因此我想避免由於小的仍未處理的異常而導致的錯誤和重複的中斷。 這樣做的最大優勢在於,服務器程序在我們逐一跟蹤未處理的異常並提供補丁以處理它們發生時繼續運行。
感謝您的耐心等待,並隨時給予反饋。
PS:不,我沒有吸鍋。
當然'MessageBox'比'Console.Read'好! – leppie
一個好問題不會被低估,即使你做的都是錯的;-) – Steven
我想你對這種事情發生的猜測是正確的。是否可以將此應用程序作爲Windows服務而不是Console應用程序來實現?這樣,當服務由於未處理的異常而失敗時,可以讓服務自動重啓。 –