使用 Visual Basic .NET 在 ASP.NET 中创建自定义错误报告页面

本文介绍如何使用 Microsoft Visual Basic .NET 代码在 ASP.NET 中捕获和响应错误。

原始产品版本: Visual Basic .NET,ASP.NET
原始 KB 数: 308132

总结

ASP.NET 改进了传统 Active Server Pages(ASP)中的错误处理选项。 在 ASP.NET 中,可以在应用程序中处理多个不同级别的错误。

ASP.NET 中的新功能

ASP.NET 提供了多项进展,可帮助你处理和响应错误。 在传统的 ASP 中,可以处理 JScript On Error Resume Next 中的错误(或 try-catch 块)。 或者,如果运行的是 Internet Information Services (IIS),则可以使用该 ASPError 对象创建自定义错误报告页。 但是,这些方法有其限制。

ASP.NET 提供了多个级别,可在其中处理和响应运行 ASP.NET 应用程序时可能发生的错误。 ASP.NET 提供了三种主要方法,可让你在发生错误时捕获和响应错误: Page_Error 事件、 Application_Error 事件和应用程序配置文件(Web.config)。

本文演示如何在 ASP.NET 应用程序中使用这些新功能。 尽管本文介绍如何提供自定义错误页和常规错误报告,因为它与 ASP.NET 直接相关,但本文不介绍其他错误处理方法,如 try-catch-finally 块和公共语言运行时 (CLR) 异常系统。

使用 Page_Error 事件

Page_Error 事件提供了一种方法来捕获在页面级别发生的错误。 可以显示错误信息(如要遵循的示例代码所示),也可以记录事件或执行其他一些操作。

注意

本示例仅在浏览器中显示详细的错误信息,仅用于演示目的。 向应用程序的最终用户显示详细信息时,尤其是当应用程序在 Internet 上运行时,需要谨慎。 更适当的操作是向用户显示一条消息,通知他们发生错误,然后实际记录事件日志中的特定错误详细信息。

此示例引发 null 异常,该异常强制在事件中 Page_Load 发生错误。 按照以下步骤创建将测试 Page_Error 事件的初始页面。

  1. 按照以下步骤将名为 PageEvent.aspx 的新文件添加到项目:

    1. 打开 Visual Studio .NET。
    2. 在解决方案资源管理器中,右键单击项目节点,指向“添加”,然后单击“添加 Web 窗体”。
    3. “名称” 文本框中,键入 PageEvent.aspx,然后单击“ 打开”。
  2. 将以下代码添加到 PageEvent.aspx

    <%@ Page Language="vb"%>
    <script runat=server>
        Sub Page_Load(Sender as object, e as EventArgs)
           throw(new System.ArgumentNullException())
        End Sub
        Sub Page_Error(Sender as object, e as EventArgs)
           Dim objErr as Exception = Server.GetLastError().GetBaseException()
           Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _
                               "<br><b>Error in: </b>" & Request.Url.ToString() & _
                               "<br><b>Error Message: </b>" & objErr.Message.ToString() & _
                               "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString()
           Response.Write(err.ToString())
           Server.ClearError()
        End Sub
    </script>
    
  3. “文件”菜单中,单击“保存PageEvent.aspx

  4. 右键单击页面,然后单击“在浏览器中查看以运行页面。 请注意,错误会根据代码规范引发并报告。

注意

你可能会注意到代码发出调用 Server.ClearError。 这可以防止错误继续处理事件 Application_Error

使用 Application_Error 事件

Page_Error与事件类似,可以使用Application_Error该事件捕获应用程序中发生的错误。 由于事件的应用程序范围,可以记录应用程序错误信息或处理可能发生的其他应用程序级错误。

要关注的示例基于前面的 Page_Error 事件代码示例,如果事件中的 Page_Load 错误未捕获到 Page_Error 事件中,则会触发该示例。 事件 Application_Error应用程序的 Global.asax 文件中指定。 为简单起见,本部分中的步骤将创建一个新页面,用于引发异常、捕获 Global.asax 文件事件中的Application_Error错误,并将错误写入事件日志。 以下步骤演示如何使用该 Application_Error 事件:

  1. 将名为 AppEvent.aspx 的新文件添加到项目。

  2. 将以下代码添加到 AppEvent.aspx

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. “文件”菜单中,单击“保存AppEvent.aspx

  4. Application_Error事件添加到 Global.asax 文件,以捕获在AppEvent.aspx页中Page_Load引发的错误。 请注意,必须将命名空间的System.Diagnostics语句添加到 Imports Global.asax 以使用事件日志。

    将以下代码添加到 Global.asax 文件:

    Imports System.Diagnostics
    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim objErr As Exception = Server.GetLastError().GetBaseException()
        Dim err As String = "Error Caught in Application_Error event" & _
                                System.Environment.NewLine & _
                                "Error in: " & Request.Url.ToString() & _
                                System.Environment.NewLine & _
                                "Error Message: " & objErr.Message.ToString() & _
                                System.Environment.NewLine & _
                                "Stack Trace:" & objErr.StackTrace.ToString()
        EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
        Server.ClearError()
        additional actions...
    End Sub
    
  5. 保存 Global.asax 文件。

  6. 在 Visual Studio .NET 的 “生成 ”菜单上,单击“ 生成”。

  7. 右键单击页面,然后单击 “在浏览器中查看 ”。 在这种情况下,页面将为空,但应注意到事件日志中已添加新条目。 此示例使应用程序日志中的条目可从事件查看器访问。 记录错误后,可能需要将用户重定向到另一个更用户友好的错误页,或根据需要执行一些其他操作。

使用 Web.config 文件

如果未在或Application_Error事件中Page_Error调用Server.ClearError或捕获错误,则会根据 Web.config 文件中的设置<customErrors>来处理该错误。 在本 <customErrors> 部分中,可以将重定向页指定为默认错误页(defaultRedirect)或根据引发的超文本传输协议(HTTP)错误代码指定给特定页面。 可以使用此方法自定义用户收到的错误消息。

如果发生错误,该错误未捕获到应用程序中任何以前的级别,则会显示此自定义页面。 本部分演示如何修改 Global.asax 文件, Server.ClearError 以便从不调用该文件。 因此,错误在 Web.config 文件中作为捕获错误的最后一个点进行处理。

  1. 打开上一示例中的 Global.asax 文件。

  2. 注释掉该 Server.ClearError 行以确保错误显示在 Web.config 文件中。

  3. 将更改 保存到 Global.asax。 代码现在应如下所示:

     Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
         Dim objErr As Exception = Server.GetLastError().GetBaseException()
         Dim err As String = "Error Caught in Application_Error event" & _
                             System.Environment.NewLine & _
                             "Error in: " & Request.Url.ToString() & _
                             System.Environment.NewLine & _
                             "Error Message: " & objErr.Message.ToString() & _
                             System.Environment.NewLine & _
                             "Stack Trace:" & objErr.StackTrace.ToString()
         EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
         Server.ClearError()
         additional actions...
     End Sub
    
  4. 将以下代码添加到 <customErrors> 节,以将用户重定向到自定义页面:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    注意

    必须修改属性中的 defaultRedirect 文件路径,使其引用相关的 Web 服务器和应用程序名称。

  5. 由于此级别捕获的错误将发送到默认错误页,因此必须创建名为 ErrorStatus.htm的错误页。 请记住,使用此方法控制向用户呈现的内容,因此本示例对错误页使用 .htm 页。 将以下代码添加到 ErrorStatus.htm

    <HTML>
        <HEAD>
            <TITLE></TITLE>
            <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
        </HEAD>
        <BODY>
             <b>Custom Error page!</b>
             <br>
             You have been redirected here from the <customErrors> section of the
             Web.config file.
        </BODY>
    </HTML>
    
  6. 若要测试代码,请保存文件、生成项目,然后在浏览器中查看 AppEvent.aspx 。 请注意,当引发错误时,会重定向到 ErrorStatus.htm 页。 虽然可以在节中属性<customErrors>的值defaultRedirect中引用默认错误页,但也可以指定要根据引发的 HTTP 错误代码重定向到的特定页面。 <error>子元素允许使用此选项。 例如:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
        <error statusCode="404" redirect="filenotfound.htm"/>
    </customErrors>
    

注意

节中指定的defaultRedirect<customErrors>页面是.htm文件。 如果打算在.aspx页(GetLastError执行和Application_ErrorPage_Error示例),则必须在重定向发生之前将异常存储在会话变量或其他一些方法中。

请注意,该 <customErrors> 节包含一个 mode 设置为 On .. 该 mode 属性用于控制错误重定向的发生方式。 例如,如果要开发应用程序,则最有可能看到实际的 ASP.NET 错误消息,并且不希望重定向到更用户友好的错误页。 该 mode 属性包括以下设置:

  • On:未经处理的异常将用户重定向到指定的 defaultRedirect 页面。 这 mode 主要用于生产。

  • Off:用户收到异常信息,不会重定向到 defaultRedirect 页面。 这 mode 主要用于开发。

  • RemoteOnly:仅访问本地计算机上的站点的用户(使用 localhost)接收异常信息。 所有其他用户将重定向到 defaultRedirect 页面。 此模式主要用于调试。

故障排除

在 Windows 上的默认安装中,ASP.NET 在工作进程中运行 Web 应用程序代码。 此过程的标识默认为名为 ASPNET 帐户的未特权本地帐户。 在 ASP.NET 的 beta 版本中,进程标识是 System,这是一个强大的管理帐户,拥有计算机上的许多特权。

在 Windows Server(IIS)上的默认安装中,ASP.NET 在工作进程中运行 Web 应用程序代码。 此过程的标识默认为名为 NetworkService 的有限帐户。

有关此更改以及如何在本文中运行代码以及可能需要其他访问权限的其他代码的详细信息,请参阅 模式和做法

参考