备注:必须修改 defaultRedirect 属性中的文件路径,以便它 引用相关的 Web 服务器和应用程序名称。 因为在此级别捕获的错误会发送到默认的错误页,所以, 必须创建一个名为 ErrorStatus.htm 的错误页。请记住,您要使 用此方法来控制向用户呈现的内容,因此本示例使用 .htm 页作为错误页。将以下代码添加到 ErrorStatus.htm 中:
ASP.NET 中的新功能
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 的新文件添加到项目中:
打开 Microsoft Visual Studio .NET。
在"解决方案资源管理器"中,右键单击该项目节点,指向添加,然后单
击添加 Web 窗体。
在名称文本框中,键入 PageEvent.aspx,然后单击打开。
将以下代码添加到 PageEvent.aspx 中:
从文件菜单中,单击保存 PageEvent.aspx。
右键单击该页,然后单击在浏览器中查看以运行该页。请注意,将按照代码规范引发和报告错误。
此外,您还应记下 @ Page 指令中的 inherits 属性。
如何使用 Application_Error 事件
下面的示例基于前面的 Page_Error 事件代码示例,如果 Page_Load 事件中的错误未在 Page_Error 事件中捕获,将引发异常。application_error 事件在应用程序的 Global.asax 文件中进行指定。为简单起见,本节中的步骤创建一个要在其中引发异常的新页,捕获 Global.asax 文件的 Application_Error 事件中的错误,并将该错误写入事件日志中。下面的步骤演示如何使用 Application_Error 事件:
将名为 AppEvent.aspx 的新文件添加到项目中:
将以下代码添加到 AppEvent.aspx 中:
从文件菜单中,单击保存 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 中,在生成菜单上,单击生成。
右键单击该页,然后单击在浏览器中查看。在这种情况下该页将为空白,但是您应该注意到在事件日志中已添加了一个新项。本示例在应用程序日志中生成一个项,可从事件查看器访问应用程序日志。在记录错误之后,您可能希望将用户重定向到另一个更用户友好的错误页或者根据需要执行一些其他操作。
如何使用 Web.config 文件
如果发生在应用程序以前的任一级别都未捕获到的错误,则显示这个自定义页。本节演示如何修改 Global.asax 文件,以便从不调用 Server.ClearError。因此,错误在作为捕获错误的最后一点的 Web.config 文件中进行处理。
从上一个示例中打开 Global.asax 文件。
将 Server.ClearError 行注释掉,以便确保错误出现在 Web.config 文件中。
将所作更改保存到 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...
}
将以下代码添加到
custom Error page!
You have been redirected here from the <customErrors> section of the
Web.config file.
若要测试该代码,请保存这些文件,生成项目,然后在浏览器中查看 AppEvent.aspx。请注意,在引发错误时,您将被重定向到 ErrorStatus.htm 页。
请注意,
on:未被处理的异常将用户重定向到指定的 defaultRedirect 页。此模式主要用于生产。
off:用户收到异常信息而不是被重定向到 defaultRedirect 页。此模式主要用于开发。
remoteonly:只有在本地计算机上访问该站点的用户(通过使用 localhost)才能收到异常信息。所有其他用户都被重定向到 defaultRedirect 页。此模式主要用于调试。