日期:2010-08-29 浏览次数:20457 次
本文介绍如何在 ASP.NET 中发生错误时使用 Visual C# .NET 代码捕获和响应错误。ASP.NET 改进了传统的 Microsoft Active Server Page (ASP) 中的错误处理选项。在 ASP.NET 中,您可在应用程序中处理若干不同级别的错误。
ASP.NET 在处理和响应错误的方式上进行了若干改进。在传统的 ASP 中,是用"On Error Resume Next"(或在 Jscript 中用 try-catch 块)处理错误的。或者,如果您运行的是 Microsoft Internet Information Services (IIS) 5.0,则使用 ASPError 对象创建自定义的错误报告页。然而,这些方法都有其局限性。
ASP.NET 提供了在运行 ASP.NET 应用程序时可能出现的错误的若干处理和响应级别。ASP.NET 提供三种用于在出现错误时捕获和响应错误的主要方法:page_error 事件、application_error 事件以及应用程序配置文件 (Web.config)。
本文演示如何在 ASP.NET 应用程序中使用这些新功能。尽管本文由于与 ASP.NET 直接相关而介绍了如何提供自定义错误页和一般错误报告,但是它并不介绍其他错误处理方法,如 try-catch-finally 块和公共语言运行库 (CLR) 异常系统。
page_error 事件提供一种捕获在页级别出现的错误的方法。您可以只是显示错误信息(正如下面的示例代码所示),也可以记录事件或执行某个其他操作。
备注:此示例在浏览器中显示详细的错误信息,提供此示例只是为了进行说明。向应用程序的最终用户显示详细信息(尤其是该应用程序在 Internet 上运行时)一定要小心。更适当的做法是向用户显示一条消息,告知已发生错误,然后将具体的错误详细信息记录在事件日志中。
本示例引发一个强迫错误发生在 Page_Load 事件中的空异常。按照以下步骤可创建将测试 Page_Error 事件的初始页。
按照以下步骤将名为 PageEvent.aspx 的新文件添加到项目中:
| |||
将以下代码添加到 PageEvent.aspx 中: <SCRIPT language=C# runat="server">void Page_Load(object sender, System.EventArgs e){throw(new ArgumentNullException());}public void Page_Error(object sender,EventArgs e){Exception objErr = Server.GetLastError().GetBaseException();string err ="error Caught in Page_Error event | |||
从文件菜单中,单击保存 PageEvent.aspx。 | |||
右键单击该页,然后单击在浏览器中查看以运行该页。请注意,将按照代码规范引发和报告错误。 |
备注:您可能注意到代码发出对 Server.ClearError 的调用。这将防止错误继续到要被处理的 Application_Error 事件中。
此外,您还应记下 @ Page 指令中的 inherits 属性。
如果已经设置 inherits,则必须首先生成项目,然后再浏览到该页。
如果不首先生成项目,将看到下面的错误信息:
'Project.PageEvent' is not a valid type
与 Page_Error 事件相类似,您可使用 Application_Error 事件捕获发生在应用程序中的错误。由于事件发生在整个应用程序范围内,因此您可记录应用程序的错误信息或处理其他可能发生的应用程序级别的错误。
下面的示例基于前面的 Page_Error 事件代码示例,如果 Page_Load 事件中的错误未在 Page_Error 事件中捕获,将引发异常。application_error 事件在应用程序的 Global.asax 文件中进行指定。为简单起见,本节中的步骤创建一个要在其中引发异常的新页,捕获 Global.asax 文件的 Application_Error 事件中的错误,并将该错误写入事件日志中。下面的步骤演示如何使用 Application_Error 事件:
将名为 AppEvent.aspx 的新文件添加到项目中: |
将以下代码添加到 AppEvent.aspx 中: <SCRIPT language=C# runat="server">void Page_Load(object sender, System.EventArgs e){throw(new ArgumentNullException());}</SCRIPT> |
从文件菜单中,单击保存 AppEvent.aspx。 |
将 Application_Error 事件添加到 Global.asax 文件中以捕获在 AppEvent.aspx 页的 Page_Load 事件中引发的错误。注意,您必须为 System.Diagnostics 名称空间将另一条 using 语句添加到 Global.asax,才能使用事件日志。 将以下代码添加到 Global.asax 文件中: using System.Diagnostics;protected void Application_Error(object sender, EventArgs e){Exception objErr = Server.GetLastError().GetBaseException();string err ="Error Caught in Application_Error event\n" +"Error in:" + Request.Url.ToString() +"\nError Message:"+ objErr.Message.ToString() +"\nStack Trace:"+ objErr.StackTrace.ToString();EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);Server.ClearError();//additional actions...} |
保存 Global.asax 文件。 |
在 Visual Studio .NET 中,在生成菜单上,单击生成。 |
右键单击该页,然后单击在浏览器中查看。在这种情况下该页将为空白,但是您应该注意到在事件日志中已添加了一个新项。本示例在应用程序日志中生成一个项,可从事件查看器访问应用程序日志。在记录错误之后,您可能希望将用户重定向到另一个更用户友好的错误页或者根据需要执行一些其他操作。 |
如果您不调用 Server.ClearErr