ASP.NET错误处理的方式(整理&总结)
英文文章研究:http://wrfwjn.blog.hexun.com/4172839_d.html
总述:
要创建页中的全局处理程序,请创建 Page_Error 事件的处理程序。要创建应用程序范围的错误处理程序,请在 Global.asax 文件中将代码添加到 Application_Error 方法。只要您的页或应用程序中发生未处理的异常,就会调用这些方法。您可以从 HttpServerUtility.GetLastError 方法获取有关最新错误的信息。
注意 如果您具有全局错误处理程序,则它优先于在 Web.config customErrors 元素的 defaultRedirect 属性中指定的错误处理。
原则(MSDN):在您的应用程序显示错误信息时,它不应该泄露有助于恶意用户攻击您系统的信息。例如,如果您的应用程序试图登录数据库时没有成功,则显示的错误信息不应该包括它正在使用的用户名。
有许多方法可以控制错误信息:
将应用程序配置为不向远程(应用程序)用户显示详细错误信息。您也可以选择将错误重定向到应用程序页。
只要可行就包括错误处理,并编写您自己的错误信息。在您的错误处理程序中,您可以进行测试以确定用户是否为本地用户并作出相应的响应。
在捕捉所有未处理异常并将它们发送到一般错误页的页级别或应用程序级别上,创建全局错误处理程序。这样,即使您没有预料到某个问题,至少用户不会看到异常页。
<一>页面级的错误处理
在Asp.net开发过程中,我们会遇到很多Exception,不处理这些Exception的话会出现很难看的页面。
还有一些我们未预料到的Exception,当发生Exception时,我们也必须进行记录具体位置,以便我们修正错误。
asp.net异常处理的位置大概有以下3个地方
1. 程序的代码段中,这是最直接处理异常的地方。如下
try
{
n=Convert.ToInt32(info);
}
catch(Exception)
{
}
只是最基本处理异常的地方。
2. ASP.NET的中的Application_Error中.Application_Error 事件。对于应用程序中引发的任何未处理异常都会引发此事件。一般我们处理如下
protected void Application_Error(Object sender, EventArgs e)
{
Exception exp=Server.GetLastError();
//ErrorLog.Log(exp);
//====================================
string strE="内部错误:"+e.InnerException.ToString()+"\r\n堆栈:"+e.StackTrace+"\r "+"Message:"+e.Message+"\r 来源:"+e.Source;
Log(strE);
Server.ClearError();
Server.Transfer("Error.aspx",false);
}
这样我们就可以处理Server端出现的错误。我们记录出错的源头。
3. 也可以在页级别或者应用程序级别处理代码错误。Page 基类公开了一个 Page_Error 方法,此方法在页中可以被重写。每当运行时引发未捕获的异常时都调用此方法。
void Page_Error(Object source, EventArgs e) {
String message = "<font face=verdana color=red>"
+ "<h4>" + Request.Url.ToString() + "</h4>"
+ "<pre><font color='red'>"
+ Server.GetLastError().ToString() + "</pre>"
+ "</font>";
Response.Write(message);
}
下面我讲述一下怎么在ASP.NET程序里面统一的处理异常,我们以最常见的Session过期为例
我们先写一个Session过期的异常
public class YSessionException:Exception
{
}
我们再定义一个属性
public int SessionValue
{
get{ if(Session["SessionValue"]==null)
{
throw new YSessionException("");
}
}
}
下面我们在Page_Error或者Application_Error中处理这个异常
{
Exception exp=Server.GetLastError();
if(exp is YSessionException)
{
..................
}
Server.ClearError();
Server.Transfer("Error.aspx",false);
}
这样就可以为我们程序提供很好的Exception处理界面。