2010-07-12 54 views
3

這感覺就像是之前可能已經問過的問題,但我找不到它,因此詢問(可能再次)。如何在Windows .NET服務中執行錯誤處理

我正在寫一個Windows服務來做一些文件監視和處理。它的一切都在做我想做的事情,但我知道有幾個地方我的代碼在讀取/寫入文件系統或事件日誌時可能會引發錯誤。我願意投入一些我認爲會出現錯誤的嘗試/捕獲,但是我想要做一些全局錯誤處理來解決所有這些未解決的問題。我不知道如何做到這一點。

我的第一個想法是尋找某種類似於我在ASP.NET項目中找到的全局錯誤處理程序,但無法看到這些行中的任何內容。

另一個想法是,我可以讓我所有的頂級函數調用,並圍繞他們嘗試/抓住。正如我看到的那樣,這意味着圍繞我的所有事件處理程序代碼和我的服務「啓動」和「停止」方法進行try/catch。這並不是一種很好的做法,所以我認爲我可能以錯誤的方式接近這一點。任何人都可以提出我應該在錯誤處理方面做些什麼?

我認爲在一個服務中,我不希望它只是拋出錯誤,因爲它可能會停止服務,或者實際上應該讓服務崩潰並通過我見過的恢復機制自動重啓它?

我很大的不確定性在這裏,請與我分享你的智慧... :)

回答

6

有在把一個try/catch在服務的主要方法沒有問題,並記錄錯誤,這樣你就可以修復它們。如果發現錯誤是意外的,那麼您可以乾淨地關閉服務。

此外,除了主要的try/catch之外,您還必須爲每一個您無法避免發生的潛在異常(即網絡問題)添加try/catch,以便您可以採取相應的行動以恢復正確的行爲應用程序,避免服務崩潰。

最後,請記住,您必須爲每個不同線程的每個頂級方法執行此操作,因爲異常不會傳播到線程範圍之外。

0

我們已經在我們多年來編寫的許多Windows服務中成功地使用了它。

我們總是有一個DLL的功能。在服務中,當我們在dll中實例化和運行函數時,我們將這個調用包裝在try/catch中。然後,該服務可以記錄或響應拋出的任何未預見的異常。

您當然會將可疑代碼封裝在try/catch塊中的dll中,並在那裏做適當的操作。

0

服務不應該失敗。通常情況下,服務中的事件是由事件(網絡調用或計時器)觸發的......每個事件運行的代碼都應該在try catch中,以便服務永不停止。

我建議記錄到事件日誌以查找錯誤和其他重要信息。你可以使用log4net + EventLogAppender這樣做。

它仍然可能發生,服務因硬件問題(如全磁盤或內存問題)而關閉。如果您希望它自動重啓,可以在「NT服務選項」對話框或安裝程序中設置恢復。

相關問題