吞未處理的異常,我使用SFTP使用Windows服務在C#中的文件傳輸(ssh.net)。 我已經處理了每個代碼塊中的異常仍然我得到未處理的異常和我的Windows服務崩潰。可我們在Windows服務
我用
AppDomain.CurrentDomain.UnhandledException
是有可能避免這種未處理的異常,並從被撞壞避免服務想通了約未處理的異常。
在此先感謝。 Vijay
吞未處理的異常,我使用SFTP使用Windows服務在C#中的文件傳輸(ssh.net)。 我已經處理了每個代碼塊中的異常仍然我得到未處理的異常和我的Windows服務崩潰。可我們在Windows服務
我用
AppDomain.CurrentDomain.UnhandledException
是有可能避免這種未處理的異常,並從被撞壞避免服務想通了約未處理的異常。
在此先感謝。 Vijay
不,因爲UnhandledException
不會改變進程正在關閉的事實。它只是讓你有機會做一些事情(例如記錄失敗)。
即使事情可以工作那樣,事實是,你的服務有缺陷。你應該尋找更多的解決方法,而不是隱藏它們。
是有可能避免這種未處理的異常,並從被撞壞避免服務。
是的。這也是一個糟糕的設計決定。
AppDomain.CurrentDomain.UnhandledException
這是擺在萬不得已的處理程序寫入崩潰報告的好地方,然後重新啓動該服務。
吞嚥異常是不聰明。您期望的每個異常都必須處理。
我在每個處理異常和每一個代碼塊還是我收到未處理的異常
聽起來像是你不知道你在做什麼。沒有必要在每個代碼塊中處理異常 - 它完全用異常處理程序重載代碼。但是,有必要在有意義的地方進行適當的異常處理,並捕獲每個SENSIBLE(可預期的)異常。
避免崩潰的服務是不聰明 - 因爲如果你不知道你有什麼異常,那麼你可能會損壞的服務,而不是墜毀一個結束。快速而艱難地失敗仍然是編寫可靠服務器系統的唯一方式。
避免未處理的異常的唯一方法是不是有一個!假設你的服務沒有使用任何多線程功能,這可能會在單獨的線程上拋出異常,你可以繞過你的ServiceBase.Run呼叫
擺脫異常處理程序。這樣,任何滑過的異常都可以在最後一刻抓到並處理。通常,雖然你想嘗試抓住這些較低的和相應的處理
隨着線程應用程序,它變得更加困難,因爲每個生成的新線程不會拋出主線程,不會被處理'全部'處理程序。
編輯:
我想補充一點,我不縱容這樣做 - 最好你應該在正確的地方來處理異常 - 如果你得到你不期望未處理的異常,那麼你需要檢查看看堆棧出了什麼問題。將處理程序添加到AppDomain.UnhandledException並將異常樹和堆棧寫入日誌將有所幫助(您確實有一些日誌機制,對吧?)。要麼或調試
提供異常的堆棧跟蹤。另外一個你如何手動處理例外的例子將不勝感激。 – leppie 2012-07-09 10:54:33
如果您在某處添加了catch-all-exception處理程序,則說明您沒有解決問題,並且正在控制症狀。修復錯誤更好。 – Maarten 2012-07-09 10:57:13
例外情況應該是處理或預防,不能吃...... – Alex 2012-07-09 11:00:24