使用 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) 中的 (或try-catch块来处理错误On Error Resume Next。 或者,如果运行 Internet Information Services (IIS) ,则使用 ASPError 对象创建自定义错误报告页。 但是,这些方法有其局限性。

ASP.NET 提供了多个级别,你可以在其中处理和响应运行 ASP.NET 应用程序时可能发生的错误。 ASP.NET 提供了三种main方法,可用于捕获错误并在错误发生时做出响应: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 文件中指定。 为简单起见,本部分中的步骤会创建一个新页面,以便在其中引发异常、捕获 Application_ErrorGlobal.asax 文件时的错误,并将错误写入事件日志。 以下步骤演示如何使用 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 文件,以捕获在 Page_LoadAppEvent.aspx 页中引发的错误。 请注意,必须将命名空间的System.Diagnostics语句添加到 ImportsGlobal.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 文件。 如果打算 GetLastError.aspx 页中使用 和 Page_ErrorApplication_Error 示例) (,则必须在重定向发生之前将异常存储在会话变量或其他某种方法中。

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

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

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

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

疑难解答

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

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

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

References