2012-07-09 116 views
0

吞未處理的異常,我使用SFTP使用Windows服務在C#中的文件傳輸(ssh.net)。 我已經處理了每個代碼塊中的異常仍然我得到未處理的異常和我的Windows服務崩潰。可我們在Windows服務

我用

AppDomain.CurrentDomain.UnhandledException 

是有可能避免這種未處理的異常,並從被撞壞避免服務想通了約未處理的異常。

在此先感謝。 Vijay

+0

提供異常的堆棧跟蹤。另外一個你如何手動處理例外的例子將不勝感激。 – leppie 2012-07-09 10:54:33

+1

如果您在某處添加了catch-all-exception處理程序,則說明您沒有解決問題,並且正在控制症狀。修復錯誤更好。 – Maarten 2012-07-09 10:57:13

+0

例外情況應該是處理或預防,不能吃...... – Alex 2012-07-09 11:00:24

回答

3

不,因爲UnhandledException不會改變進程正在關閉的事實。它只是讓你有機會做一些事情(例如記錄失敗)。

即使事情可以工作那樣,事實是,你的服務有缺陷。你應該尋找更多的解決方法,而不是隱藏它們。

+0

服務的行爲就是這樣,如果我已經開始文件傳輸,如果路由器斷電,它肯定會拋出異常,並且我已經處理但仍然未處理。不知道爲什麼? – vijay 2012-07-09 11:14:33

+1

如果它未處理,那麼顯然你沒有處理它。 – Jon 2012-07-09 11:15:30

1

是有可能避免這種未處理的異常,並從被撞壞避免服務。

是的。這也是一個糟糕的設計決定。

AppDomain.CurrentDomain.UnhandledException

這是擺在萬不得已的處理程序寫入崩潰報告的好地方,然後重新啓動該服務。

吞嚥異常是不聰明。您期望的每個異常都必須處理。

我在每個處理異常和每一個代碼塊還是我收到未處理的異常

聽起來像是你不知道你在做什麼。沒有必要在每個代碼塊中處理異常 - 它完全用異常處理程序重載代碼。但是,有必要在有意義的地方進行適當的異常處理,並捕獲每個SENSIBLE(可預期的)異常。

避免崩潰的服務是不聰明 - 因爲如果你不知道你有什麼異常,那麼你可能會損壞的服務,而不是墜毀一個結束。快速而艱難地失敗仍然是編寫可靠服務器系統的唯一方式。

+0

我在sFTP路由器上傳輸文件,並且有可能路由器未連接,路由器在進程之間關閉。所以會引發異常。我也有記錄機制,所以我想通了,我處理的異常再次被拋出。 – vijay 2012-07-09 11:09:59

+0

不,對不起。大多數運行到2-3個基本例外。網絡不是一個未知的情況。在一個合格的程序員不能解決所有問題的許多地方,應該不會有這麼多例外。在相關的代碼部分,你甚至可能有一個捕獲(例外) - 但只有在那裏,沒有其他地方。 – TomTom 2012-07-09 11:10:30

0

避免未處理的異常的唯一方法是不是有一個!假設你的服務沒有使用任何多線程功能,這可能會在單獨的線程上拋出異常,你可以繞過你的ServiceBase.Run呼叫

擺脫異常處理程序。這樣,任何滑過的異常都可以在最後一刻抓到並處理。通常,雖然你想嘗試抓住這些較低的和相應的處理

隨着線程應用程序,它變得更加困難,因爲每個生成的新線程不會拋出主線程,不會被處理'全部'處理程序。

編輯:

我想補充一點,我不縱容這樣做 - 最好你應該在正確的地方來處理異常 - 如果你得到你不期望未處理的異常,那麼你需要檢查看看堆棧出了什麼問題。將處理程序添加到AppDomain.UnhandledException並將異常樹和堆棧寫入日誌將有所幫助(您確實有一些日誌機制,對吧?)。要麼或調試

相關問題