[英]What's the best way to handle web.config file versions in 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
..我看到它們是處理錯誤的好習慣
異常處理是一個大問題,為此設計一個好的策略並不簡單。
首先,一些一般規則:
對於第三點, 記錄異常並定期分析日志以查找任何奇怪的情況非常重要。 那么,讓我們從具體的答案開始吧。
想想“處理”異常。 當您編寫每個代碼行時,請考慮可能阻止其完成的可能問題,並考慮可能的糾正措施 。 如果可能的話。 錯誤消息不是一種好的處理方式,這是最新的策略。
不要開始編寫try-catch(Exception),但更喜歡特定的異常。 如果你需要將字符串解析為數字等,那么期望FormatException
,如果你需要從Object
InvalidCastException
為你的類型期望InvalidCastException
不要猶豫,拋出異常! 不要像許多人那樣做,即。 return null
或使用(如ANSI C)布爾返回值和引用參數。 有例外。 如果你可以處理異常(即你沒有找到本地文件,但你知道你有遠程備份,那么通過調用遠程鏡像處理FileNotFoundException
,但如果你仍然無法連接,那么最終拋出)然后執行它並嘗試恢復計算,但如果你不能然后扔。 並且不要忘記拋出內部異常(如果存在),因為它有助於登錄最高層。
基本上,即使你沒有抓到任何東西,你仍然可以決定自己拋出異常! 特別是當功能參數無效時,強烈建議這樣做!
另一個不錯的選擇是仍然登錄底層。 無論發生異常,您實際上都想記錄。
記得給消息一個足夠的嚴重性。 如果您通過代碼發現數據庫處於脫機狀態,那么這不是意外的異常。 仍然將其記錄為錯誤,但在調查日志時不要擔心代碼錯誤。 相反,如果您捕獲到代碼無法識別的異常( NullReferenceException
是一個典型示例),則以最高嚴重性記錄,即。 致命的,給予它最大的優先權!
肯定可以基於Page.OnError
方法。 如果您的站點的所有頁面都有基頁類,那么您絕對應該覆蓋該方法。 在該方法中,您應該首先記錄您的異常。
您也不應該濫用try-catch(異常)塊,因為如果您沒有捕獲異常,則無法使用catch處理,您將不得不通過OnError處理它。
運行這樣的方法時,不要立即考慮Server.RemoveError()
。 您可能更喜歡為HTTP 500錯誤(當未處理的異常冒泡到ASP.NET運行時時觸發)的靜態HTML頁面向用戶顯示禮貌消息。
throw
底層 OnError
或Application_Error
作為單個中心點來處理所有意外異常 看看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.