簡體   English   中英

處理.net中的異常

[英]handling exceptions in .net

我在這里問了幾個問題並閱讀了一些關於異常處理的文章,但是我不認為我應該在你應該什么時候以及什么時候不應該處理異常。 從我讀過的文章中可以看出“只處理你可以從中恢復的異常”這是什么意思。 如果我無法處理異常,我該怎么辦? 讓它傳播回堆棧? 如果我不處理它,我如何記錄它並提供用戶友好的錯誤消息。 大多數人在網絡應用和網絡服務方面做了什么?

舉個例子說我有一個從sql中提取數據的低層數據層

try{
  //do something with db
}catch(SqlException ex){
 //what should i do here
 //should i call code again to retry getting data from db
}catch(Exception ex){
 //should i even catch exception of type exception
}

如何處理較低層中的異常? 我應該讓異常泡到層級嗎? 如果是這樣,那么如果我想捕獲sqlexception類型的異常,那么我需要對庫sqlexception的引用是一部分,但我當然不應該在與數據訪問無關的層中引用該庫。

一些簡單的基本規則:

  • 處理異常需要程序的狀態與導致異常的代碼啟動前的狀態完全相同 您需要大量的catch和finally塊才能將變量恢復到初始狀態。

  • 只有在捕獲它時才考慮處理異常允許程序以有意義的方式繼續運行。 例如,當數據庫服務器脫機時很難做任何有用的事情,也可以停止程序。

  • 如果您需要一個人來采取糾正措施(您幾乎總是這樣做),那么請確保她有足夠的信息來解決問題。 讓異常冒泡到UI層。 避免解釋異常(例如,“無法更新數據庫”),顯示確切的異常消息和堆棧跟蹤。

  • 為AppDomain.CurrentDomain.UnhandledException實現一個處理程序,並記錄或顯示e.ExceptionObject的值。 幫助診斷未處理的異常。 並幫助您避免在任何地方放置捕獲物

  • 具有良好診斷的一百個未處理異常優於一個破壞程序穩定性的異常,因此它會生成錯誤數據或導致其他無關異常被拋出。

好吧,這將是太短暫的,因為它仍然在清晨,但我一直在努力解決這個問題,所以這就是我的理解:

“只處理你可以從中恢復的異常”

我的理解是,您可以在代碼中獲得一個級別的異常,您可以在其中執行某些操作。 對於低級代碼,您可以將異常氣泡備份到一個層,您可以在其中修改“進程”以處理異常並可能再次嘗試該過程。 (我通常會在錯誤的位置記錄錯誤。)

異常管理是一個很大的主題,所以我只會觸及表面。

從我讀過的文章中可以看出“只處理你可以從中恢復的異常”這是什么意思。

如果您不知道如何從特定異常中恢復,那么捕獲它通常沒有任何意義。 如果它是Web應用程序或服務,Web服務器本身將處理日志記錄和恢復。

在某些情況下,您需要捕獲異常,以便可以進行常規恢復,例如通過取消或撤消事務。 在這種情況下,可接受的方法是
捕獲異常,執行泛型恢復,然后再次拋出異常。

如果我無法處理異常,我該怎么辦。 讓它支持堆棧?

是。

如果我不處理它我如何記錄它並提供用戶友好的錯誤消息。 大多數人在網絡應用和網絡服務方面做了什么?

Web服務器將記錄異常。 如果要在Web應用程序中顯示用戶友好的錯誤消息,可以捕獲/記錄堆棧的最高級別並重定向到您的錯誤消息。 同樣,我會嘗試不捕獲System.Exception - 而是列出應用程序拋出的異常列表,並在呈現針對每種類型定制的消息之前捕獲這些類型。 隨着異常類型列表的增長,要么通過更改代碼來阻止每個新的異常類型,要么為該異常類型添加新的catch。

在Web服務中,您可以創建自定義異常並將其作為節點添加到Web服務將提供的常規異常中。

在你的代碼示例中,我不會使用try ... catch,除非你期待一個異常並且你知道如何處理它。

如何處理較低層中的異常。 我應該讓異常泡沫層級。

是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM