系統日志和異常的處理③
上一節我們講了如何捕獲異常和記錄日志,這一節我們講,沒有捕獲的或者忘記捕獲的異常包括404錯誤等,我們統一處理這個異常。
這一講是利用 Application_Error 捕獲所有異常,全局的異常處理為了減少代碼,統一異常處理,Application_Error位於Global.asax裡面,
protected void Application_Error(object sender, EventArgs e)
當一個異常在調用堆棧中沒有被處理,也沒有被框架代碼處理時,我們說這個異常未處理,它將被ASP.NET捕獲
它將捕獲所有 Application 級別的 UnhandleException 和 HttpException(比如:訪問的頁面不存在等)
總之,在這裡處理的話,那麼在頁面中的所有 try/catch 處理都可以不要了,但是我們為了記錄日志,在BLL層還是要try catch
對此未處理錯誤的處理方法是顯示一個頁面,列出該未處理異常的詳細情況。
我們通過 Application_Error事件把錯誤寫進對應的文件裡面或者數據庫中。
/// <summary> /// 全局的異常處理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Application_Error(object sender, EventArgs e) { string s = HttpContext.Current.Request.Url.ToString(); HttpServerUtility server = HttpContext.Current.Server; if (server.GetLastError() != null) { Exception lastError = server.GetLastError(); // 此處進行異常記錄,可以記錄到數據庫或文本,也可以使用其他日志記錄組件。 ExceptionHander.WriteException(lastError); Application["LastError"] = lastError; int statusCode = HttpContext.Current.Response.StatusCode; string exceptionOperator = "/SysException/Error"; try { if (!String.IsNullOrEmpty(exceptionOperator)) { exceptionOperator = new System.Web.UI.Control().ResolveUrl(exceptionOperator); string url = string.Format("{0}?ErrorUrl={1}", exceptionOperator, server.UrlEncode(s)); string script = String.Format("<script language='javascript' type='text/javascript'>window.top.location='{0}';</script>", url); Response.Write(script); Response.End(); } } catch { } } }
嘿嘿,我創造了一個錯誤 Convert.ToInt16("dddd");下面是錯誤的顯示頁面