在实际开发过程中,作为开发人员在页面报错的时候给用户一个友好提示,跳到指定页面,告诉用户当前操作不可用。在
vs2003
中有个
global
文件我们可以在那做错误处理。同样在
vs2005
中也一样,不过需要我们自己手动添加
global
文件,然后在
void Application_Error(object sender, EventArgs e) {}
把我们需要做的处理写在里面,
(
如果你是直接把错误处理机制加在了在页面类里面,这将非常麻烦
)
1
void
Application_Error(
object
sender, EventArgs e)
2 {
3 // Code that runs when an unhandled error occurs
4 Server.Transfer( " ~/Error.aspx " );
5 }
6
2 {
3 // Code that runs when an unhandled error occurs
4 Server.Transfer( " ~/Error.aspx " );
5 }
6
因为 Server.Transfer 将固定抛出 ThreadAbort Exception 异常,不用理会。
然后在指定的 Error.aspx 里你可以通过 Server.GetLastError() 来进行,错误分类,日志处理,显示信息等工作。
1
public
partial
class
Error : System.Web.UI.Page
2 {
3 protected void Page_Load( object sender, EventArgs e)
4 {
5 if ( ! IsPostBack)
6 {
7 Exception ex = Server.GetLastError().GetBaseException();
8 this .Label1.Text = DateTime.Now.ToString();
9 if (ex != null )
10 {
11 // 错误的信息
12 this .Label2.Text = ex.Message;
13 // 错误的堆栈
14 this .Label3.Text = ex.StackTrace.Replace( " " , " <br/> " );
15 // 出错的方法名
16 this .Label4.Text = ex.TargetSite.Name;
17 // 出错的类名
18 this .Label5.Text = ex.TargetSite.DeclaringType.FullName;
19 }
20 // 清空最后的错误
21 Server.ClearError();
22 }
23 }
24 }
25
2 {
3 protected void Page_Load( object sender, EventArgs e)
4 {
5 if ( ! IsPostBack)
6 {
7 Exception ex = Server.GetLastError().GetBaseException();
8 this .Label1.Text = DateTime.Now.ToString();
9 if (ex != null )
10 {
11 // 错误的信息
12 this .Label2.Text = ex.Message;
13 // 错误的堆栈
14 this .Label3.Text = ex.StackTrace.Replace( " " , " <br/> " );
15 // 出错的方法名
16 this .Label4.Text = ex.TargetSite.Name;
17 // 出错的类名
18 this .Label5.Text = ex.TargetSite.DeclaringType.FullName;
19 }
20 // 清空最后的错误
21 Server.ClearError();
22 }
23 }
24 }
25
当一个异常在调用堆栈中没有被处理,也没有被框架代码处理时,我们说这个异常未处理,它将被ASP.NET捕获,ASP.NET对此未处理错误的处理方法是显示一个页面,列出该未处理异常的详细情况。
有两个在异常未处理时将被ASP.NET调用的事件:
Page_Error event
,它提供捕获在Page级别发生错误的方法。
Application_Error event
,它提供捕获在代码中的任何地方发生错误的方法。该事件的范围是整个应用程序,这使它成为添加日志代码的一个理想地方。
这两个事件的执行顺序是——先执行Page_Error,后执行Application_Error。如果希望在Page_Error中处理过的错误就不要再在Application_Error中处理,我们可以在Page_Error中处理错误之后,使用Server.ClearError方法清除最后一个错误,避免再调用Application_Error。
我们可以在Global.asax文件中找到这应用程序级错误事件Application_Error,用以下代码记录我们的错误日志。(在这里处理的话,那么在页面中的所有 try/catch 处理都可以不要了
)
protected void Application_Error(Object sender, EventArgs e)
{
EventLog.WriteEntry("MyProject", Server.GetLastError().InnerException.Message,
EventLogEntryType.Error);
}
然后我们可以在“控制面板->管理工具->事件查看器”中查看我们的错误日志。
例:
新建
web
程序
——
新建
AppEvent.aspx
页面
——
在该页面的源码中添加如下代码:
< SCRIPT language=C# runat="server">
void Page_Load(object sender, System.EventArgs e)
{
throw(new ArgumentNullException());
}
< /SCRIPT>
< SCRIPT language=C# runat="server">
void Page_Load(object sender, System.EventArgs e)
{
throw(new ArgumentNullException());
}
< /SCRIPT>
然后呢,将
Application_Error
事件添加到
Global.asax
文件中以捕获在
AppEvent.aspx
页的
Page_Load
事件中引发的错误。将以下代码添加到
Global.asax
文件中:
1
protected
void
Application_Error(
object
sender, EventArgs e)
2 {
3 Exception objErr = Server.GetLastError().GetBaseException(); // 获取错误
4 string err = " Error Caught in Application_Error event\n " +
5 " Error in: " + Request.Url.ToString() +
6 " \nError Message: " + objErr.Message.ToString() +
7 " \nStack Trace: " + objErr.StackTrace.ToString();
8 // 将捕获的错误写入windows的应用程序日志中,可从事件查看器中访问应用程序日志。
9 System.Diagnostics.EventLog.WriteEntry( " Test2 " , err, System.Diagnostics.EventLogEntryType.Error);
10 Server.ClearError(); // 清除异常,其他地方不再捕获此异常。
11 }
2 {
3 Exception objErr = Server.GetLastError().GetBaseException(); // 获取错误
4 string err = " Error Caught in Application_Error event\n " +
5 " Error in: " + Request.Url.ToString() +
6 " \nError Message: " + objErr.Message.ToString() +
7 " \nStack Trace: " + objErr.StackTrace.ToString();
8 // 将捕获的错误写入windows的应用程序日志中,可从事件查看器中访问应用程序日志。
9 System.Diagnostics.EventLog.WriteEntry( " Test2 " , err, System.Diagnostics.EventLogEntryType.Error);
10 Server.ClearError(); // 清除异常,其他地方不再捕获此异常。
11 }
保存刚才所做的操作,在
Visual Studio .NET
中,在生成菜单上,单击生成。右键单击该页,然后单击在浏览器中查看。在这种情况下该页将为空白,但是您应该注意到在事件日志中已添加了一个新项。本示例在应用程序日志中生成一个项,可从事件查看器访问应用程序日志。在记录错误之后,您可能希望将用户重定向到另一个用户友好的错误页或者根据需要执行一些其他操作,这些操作可以根据自己的需要来做。