系統日志和異常的處理③
上一節我們講了如何捕獲異常和記錄日志,這一節我們講,沒有捕獲的或者忘記捕獲的異常包括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");下面是錯誤的顯示頁面
