簡體   English   中英

什么是處理異常以及如何在asp.net中處理它們的最佳方法

[英]What's the best way to handle the exceptions and how to deal with them in asp.net

首先,我已經熟悉了簡單的異常處理語法,但我要問的是最佳位置,最佳時間以及處理它們的最佳方法。

我正在構建一個N層應用程序。 所以我認為DAL有時會產生一些錯誤來處理..而我剛剛了解了SqlException類,該類的處理是什么? 我曾經看過一個處理SqlException的代碼,然后它處理Exception!

在了解了實踐以及我將要處理它們之后,我計划創建一個連接數據庫並在數據庫中記錄錯誤的方法,以便我可以解決它,但我仍然不知道應該提供哪些信息收集讓我識別整個情況!


我認為異常處理並不是什么大問題。 但我時不時地讀到一些奇怪的建議 - 我從未理解 - 在問題評論中但是沒有人能回答我,因為這是一些非常古老的問題!

“不要只是明確地捕捉異常”

“應用程序中更高層使用的代碼必須始終只拋出異常,而不必擔心如何處理它們。”

編輯

那么Page_Error事件和Application_Error ..我看到它們是處理錯誤的好習慣

異常處理是一個大問題,為此設計一個好的策略並不簡單。

首先,一些一般規則:

  • 當正在運行的代碼完全無法繼續時,會發生異常,因此可能會嘗試處理一些內部異常,但最終會失敗。 想想TCP連接:如果損壞的數據包到達,它是一個例外,但TCP協議可以處理它。 如果太多損壞,則拋出I / O或套接字異常
  • 無法始終處理例外情況。 幾乎在所有情況下,當您從底層圖層獲得異常時,您無法運行更正代碼。 如果您的應用程序依賴於數據庫且處於脫機狀態,則當您獲得有關它的例外時,您只能顯示錯誤消息
  • 例外可能是意料之外的,並且可能揭示設計或實施缺陷。 例如,一個實現缺陷可能是你有一個冗余數據庫的情況,但是當你連接到第一個鏡像時你沒有嘗試第二個

對於第三點, 記錄異常並定期分析日志以查找任何奇怪的情況非常重要。 那么,讓我們從具體的答案開始吧。

首先

想想“處理”異常。 當您編寫每個代碼行時,請考慮可能阻止其完成的可能問題,並考慮可能的糾正措施 如果可能的話。 錯誤消息不是一種好的處理方式,這是最新的策略。

不要開始編寫try-catch(Exception),但更喜歡特定的異常。 如果你需要將字符串解析為數字等,那么期望FormatException ,如果你需要從Object InvalidCastException為你的類型期望InvalidCastException

編寫較低級別的圖層時

不要猶豫,拋出異常! 不要像許多人那樣做,即。 return null或使用(如ANSI C)布爾返回值和引用參數。 有例外。 如果你可以處理異常(即你沒有找到本地文件,但你知道你有遠程備份,那么通過調用遠程鏡像處理FileNotFoundException ,但如果你仍然無法連接,那么最終拋出)然后執行它並嘗試恢復計算,但如果你不能然后扔。 並且不要忘記拋出內部異常(如果存在),因為它有助於登錄最高層。

基本上,即使你沒有抓到任何東西,你仍然可以決定自己拋出異常! 特別是當功能參數無效時,強烈建議這樣做!

另一個不錯的選擇是仍然登錄底層。 無論發生異常,您實際上都想記錄。

當你記錄

記得給消息一個足夠的嚴重性。 如果您通過代碼發現數據庫處於脫機狀態,那么這不是意外的異常。 仍然將其記錄為錯誤,但在調查日志時不要擔心代碼錯誤。 相反,如果您捕獲到代碼無法識別的異常( NullReferenceException是一個典型示例),則以最高嚴重性記錄,即。 致命的,給予它最大的優先權!

ASP.NET的一個好策略

肯定可以基於Page.OnError方法。 如果您的站點的所有頁面都有基頁類,那么您絕對應該覆蓋該方法。 在該方法中,您應該首先記錄您的異常。

您也不應該濫用try-catch(異常)塊,因為如果您沒有捕獲異常,則無法使用catch處理,您不得不通過OnError處理它。

運行這樣的方法時,不要立即考慮Server.RemoveError() 您可能更喜歡為HTTP 500錯誤(當未處理的異常冒泡到ASP.NET運行時時觸發)的靜態HTML頁面向用戶顯示禮貌消息。

簡要地

  1. 如果發生任何奇怪的事情,請毫不猶豫地throw底層
  2. 正如你的建議所說,不要處理你無法處理的異常(如果你遇到一個你無法處理的異常,請重新拋出它)
  3. LOG !!!!!!!!!!!!!!!!!
  4. 不要在公共網站上向最終用戶透露異常詳細信息,永遠不要! 默認情況下,ASP.NET會阻止它發生,但您仍然可以使用OnError來打印堆棧跟蹤
  5. 使用OnErrorApplication_Error作為單個中心點來處理所有意外異常
  6. 定期檢查日志以查找錯誤/致命消息以查找代碼問題,然后考慮維護/調試/修復它

看看elmah。 它是asp.net的記錄器。 在一個漂亮的摘要頁面上呈現所有錯誤。

http://code.google.com/p/elmah/

處理異常的最佳方法是在它們適用的特定層中。 如果它是一個約束聲音,例如,2個具有相同名稱的用戶,則應該將該氣泡提升到UI並提醒用戶。

違反任何業務規則也是如此。 這些應該冒泡到UI,以便最終用戶知道出了什么問題。

SQL連接錯誤最好在DAL ...等處理。

捕獲異常的方式/時間/位置可能取決於您嘗試做什么,難以准確捕獲所有始終正確的答案。


至於你的具體問題,

我剛剛了解了SqlException類,該類的處理是什么? 我曾經看過一個處理SqlException的代碼,然后它處理Exception!

處理你認為可能發生的特定異常的好習慣,如果你不確定這個異常是什么類型,你可以只是'異常',如果你想在'SQLException'上發生特定的事情,那么'異常會發生'異常'那么編寫處理這兩者的代碼肯定沒有錯。


“不要只是明確地捕捉異常”

我相信這是指代這樣的代碼

try 
{
   int i = 1/0;
} 
catch(Exception e)
{
  //do nothing
}

這個例外將被捕獲,但你永遠不會知道它發生了,因此這不是一個好主意,並且使用該代碼的人將會摸不着頭腦。

我想你在這里問的是任何應用程序的錯誤/異常處理策略。

我認為它包括:

Where - 您認為異常可能發生或需要更多監控的所有地方,如數據庫調用,外部服務調用,數組使用,用戶輸入解析,類型轉換等等......

如何 - 所有高級別層都應該拋出異常,應該在入口點捕獲它並進行處理以了解根本原因。 通常,您可以在Application_Error()中執行此操作,捕獲異常並將其記錄以進行故障排除。 如何記錄異常取決於您。 日志文件或數據庫驅動的日志是基於您的要求和可用資源的選項。

IMO除了非常罕見的情況外,我只對I / O相關代碼使用異常處理,其中存在與服務和文件系統的交互,其功能和維護不受我的應用程序的控制。

我總是考慮使用try / catch語句以相同的方式操作程序中的邏輯(控制流),如果/ else語句工作非常糟糕的話。 如果您正確使用手頭的工具,可以避免最常見的異常。

暫無
暫無

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

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