2010-03-16 14 views
2

我正在調試啓動時遇到一些問題的服務。爲了幫助我,我將所有內容都包裝在try/catch塊中,並將任何錯誤寫入文件。我不想把它們放在每種方法中,我只是想將它們放在最高級別的方法中,以便從其他方法中捕獲異常。有沒有方法可以確定try/catch覆蓋面的差距?

雖然服務在某些條件下停止,但有些東西正在通過。有沒有一種方法可以確定我的嘗試/捕獲範圍中的差距,除了通過視覺?

+0

這是本機代碼還是託管代碼? C#或C++? – 2010-03-16 15:56:00

回答

1

嘗試嘗試/趕上main函數和所有線程函數。這應該填補國內空白,除非第三方代碼生成線程

+0

我很確定我有這個,這讓我感到困惑。 – 2010-03-16 16:00:27

+0

你確定沒有線程產生?你想做調試還是打算在生產中使用這種日誌記錄? – Andrey 2010-03-16 16:02:54

+0

線程已經產生,我只是確保我在內部捕捉異常。我正在爲此進行調試。 – 2010-03-16 16:45:06

4

你能趕上的AppDomain級別例外是這樣的:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

void CurrentDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e) 
{ 

    //Object exception = e.ExceptionObject; 
    //Boolean terminating = e.IsTerminating; 
} 

可以爲更多的例子看看這個link

+0

特別是如果應用程序是用原生C++編寫的;) – Andrey 2010-03-16 16:02:01

+0

我試過這樣做,但我認爲它沒有發現異常。我在服務的OnStart方法的第一行中訂閱了事件,並且在處理程序方法中,我調用了我的日誌記錄方法,如下所示:\t \t \t Utility.LogError(e.ExceptionObject as Exception);但是,我的服務似乎已關閉,但我沒有日誌。這應該會在其他線程上發現異常,對嗎? – 2010-03-16 16:48:25

1

您沒有指定環境(windows-service可能意味着託管或非託管)。我會猜測你在使用本機代碼,可能是C或C++。如果是這種情況,你需要確定你正在使用窗口的結構化異常處理,而不是C++ try/catch機制。取決於您的編譯器供應商,C++實現無法捕獲所有異常。

在託管代碼中,根據框架版本,存在無法解決的異常。除此之外,如果您沒有準備受限制的地區並仔細遵守CER規則,您也可能無法捕捉到異常情況。還有人提到,你可以在AppDomain中觀察未處理的異常。 (您可能不在單個應用程序域中,但這種情況並不常見,如果不是,您可能會知道)。

在這兩種情況下都要記住的另一件事是每個線程都有自己的堆棧和一組例外。如果您嘗試捕捉所有異常,則需要捕捉代表您工作的每個線程。在託管代碼中,終結器線程(執行「析構函數」或終結器代碼的垃圾回收器線程)是一個經常被忽略的地方。

但是,在我跳到任何一個之前,我會尋找一個進程退出或一個非異常退出子句。

+0

對不起,我正在使用託管代碼。 C#具體。 – 2010-03-16 16:07:54

相關問題