使用 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
事件的初始页面。
按照以下步骤将名为 PageEvent.aspx 的新文件添加到项目:
- 打开 Visual Studio .NET。
- 在解决方案资源管理器中,右键单击项目节点,指向“添加”,然后单击“添加 Web 窗体”。
- 在“ 名称 ”文本框中,键入 PageEvent.aspx,然后单击“ 打开”。
将以下代码添加到 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>
在“ 文件 ”菜单中,单击“ 保存PageEvent.aspx”。
右键单击页面,然后单击“在浏览器中 查看 ”以运行该页。 请注意,会根据代码规范引发并报告错误。
注意
你可能会注意到,代码发出对 的 Server.ClearError
调用。 这可以防止错误继续处理 Application_Error
要处理的事件。
使用 Application_Error 事件
与 Page_Error
事件类似,可以使用 Application_Error
事件捕获应用程序中发生的错误。 由于事件在应用程序范围内,可以记录应用程序错误信息或处理可能发生的其他应用程序级错误。
要遵循的示例基于前面的 Page_Error
事件代码示例,如果事件中的 Page_Load
错误未捕获到事件中 Page_Error
,则会触发该示例。 事件 Application_Error
在应用程序的 Global.asax 文件中指定。 为简单起见,本部分中的步骤会创建一个新页面,以便在其中引发异常、捕获 Application_Error
Global.asax 文件时的错误,并将错误写入事件日志。 以下步骤演示如何使用 Application_Error
事件:
将名为 AppEvent.aspx 的新文件添加到项目中。
将以下代码添加到 AppEvent.aspx:
<script language=vb runat="server"> Sub Page_Load(Sender as object, e as EventArgs) throw(new ArgumentNullException()) End Sub </script>
在“ 文件 ”菜单中,单击“ 保存AppEvent.aspx”。
将
Application_Error
事件添加到 Global.asax 文件,以捕获在Page_Load
AppEvent.aspx 页中引发的错误。 请注意,必须将命名空间的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
保存 Global.asax 文件。
在 Visual Studio .NET 的“ 生成 ”菜单上,单击“ 生成”。
右键单击页面,然后单击“在浏览器中 查看 ”。 在这种情况下,页面将为空白,但应注意到事件日志中已添加新条目。 此示例在应用程序日志中创建了一个条目,可从 事件查看器进行访问。 记录错误后,你可能希望将用户重定向到另一个用户友好的错误页,或根据需要执行一些其他操作。
使用 Web.config 文件
如果不在 或 Application_Error
事件中Page_Error
调用Server.ClearError
或捕获错误,则会根据 Web.config 文件的 部分中的设置<customErrors>
来处理错误。 <customErrors>
在 部分中,可以将重定向页指定为默认错误页, () defaultRedirect
或根据超文本传输协议 (HTTP) 引发的错误代码指定到特定页面。 可以使用此方法自定义用户收到的错误消息。
如果发生的错误未捕获到应用程序中的任何先前级别,将显示此自定义页。 本部分演示如何修改 Global.asax 文件, Server.ClearError
使其永不调用。 因此,错误在 Web.config 文件中作为捕获错误的最后一点进行处理。
打开上一示例中的 Global.asax 文件。
注释掉行
Server.ClearError
以确保错误出现在 Web.config 文件中。将更改保存到 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
将以下代码添加到 节,
<customErrors>
以将用户重定向到自定义页面:<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> </customErrors>
注意
必须在 属性中
defaultRedirect
修改文件路径,使其引用相关的 Web 服务器和应用程序名称。由于此级别捕获的错误会发送到默认错误页,因此必须创建名为 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>
若要测试代码,请保存文件、生成项目,然后在浏览器中查看 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_Error
Application_Error
示例) (,则必须在重定向发生之前将异常存储在会话变量或其他某种方法中。
请注意, <customErrors>
节包含设置为 mode
On
的属性。 属性 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
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈