asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET自定义错误页面


发布日期:2019年01月21日
 
ASP.NET自定义错误页面

ASPNET 提供三种用于在出现错误时捕获和响应错误的主要方法Page_Error 事件Application_Error 事件以及应用程序配置文件 (nfig)

如果您不调用 ServerClearError 或者捕获 Page_Error 或 Application_Error 事件中的错误则将根据 nfig 文件的 <customErrors> 部分中的设置处理错误在 <customErrors> 部分可将重定向页指定为默认的错误页 (defaultRedirect) 或者根据引发的 HTTP 错误代码指定特定页您可使用此方法自定义用户收到的错误信息

尽管您可在 <customErrors> 部分中 defaultRedirect 属性的值中引用默认的错误页但是您还可根据引发的 HTTP 错误代码指定要重定向到的特定页<error> 子元素允许使用此选项<customErrors mode=On defaultRedirect=ApplicationErroyaspx> <error statusCode= redirect=/> <error statusCode= redirect=/> <error statusCode= redirect=/> </customErrors>

自定义错误处理页面方法一添加nfig < systemweb>< /systemweb>中添加< customErrors mode=On defaultRedirect=ApplicationErroyaspx >< /customErrors>节点添加错误处理页面ApplicationErroyaspx调用下面的方法private void DealErroy()

{ HttpException erroy = new HttpException()string strCode = erroyErrorCodeToString()string strMsg = erroyMessageerroyHelpLink = sssResponseWrite(ErrorCode + strCode + < br>ResponseWrite(Message + strMsg + < br>ResponseWrite(HelpLink + erroyHelpLink + < br>ResponseWrite(Source + erroySource + < br>ResponseWrite(TargetSite + erroyTargetSite + < br>ResponseWrite(InnerException + erroyInnerException + < br>ResponseWrite(StackTrace + erroyStackTrace + < br>ResponseWrite(GetHtmlErrorMessage + erroyGetHtmlErrorMessage() + < br>ResponseWrite(erroyGetHttpCode()ToString() + erroyGetHttpCode()ToString() + < br>ResponseWrite(erroyDataToString() + erroyDataToString() + < br>}

private void DealErroy()

{ HttpException erroy = new HttpException()string strCode = erroyErrorCodeToString()string strMsg = erroyMessageerroyHelpLink = sssResponseWrite(ErrorCode + strCode + < br>ResponseWrite(Message + strMsg + < br>ResponseWrite(HelpLink + erroyHelpLink + < br>ResponseWrite(Source + erroySource + < br>ResponseWrite(TargetSite + erroyTargetSite + < br>ResponseWrite(InnerException + erroyInnerException + < br>ResponseWrite(StackTrace + erroyStackTrace + < br>ResponseWrite(GetHtmlErrorMessage + erroyGetHtmlErrorMessage() + < br>ResponseWrite(erroyGetHttpCode()ToString() + erroyGetHttpCode()ToString() + < br>ResponseWrite(erroyDataToString() + erroyDataToString() + < br>}

这种方法不能完整地显示错误信息

自定义错误处理页面方法二添加nfig < systemweb>< /systemweb>中添加< customErrors mode=On defaultRedirect=ApplicationErroyaspx >< /customErrors>节点添加Globalasax文件找到Application_Error事件加入以下代码://这是添加了一个全局应用程序类 在Application_Error事件中处理错误页面 和nfig没有关系 即使没有nfig 也是可以定位到错误页面void Application_Error(object sender EventArgs e)

{ //在出现未处理的错误时运行的代码Exception erroy = ServerGetLastError()string err = 出错页面是 + RequestUrlToString() + </br>err += 异常信息 + erroyMessage + </br>err += Source + erroySource + </br>err += StackTrace + erroyStackTrace + </br>//清除前一个异常ServerClearError()

//此处理用Session[ProError]出错所以用 Application[ProError] Application[erroy] = err//此处不是page中不能用ResponseRedirect(……/frmSysErroraspxSystemWebHttpContextCurrentResponseRedirect(HttpContextCurrentRequestApplicationPath + /ApplicationErroyaspx

} 添加错误处理页面ApplicationErroyaspx 加入以下代码protected void Page_Load(object sender EventArgs e)

{ //显示程序中的错误码if (!IsPostBack)

{ //显示程序中的错误码if (Application[erroy] != null)

{ ResponseWrite(Application[erroy]ToString())}这种方法能完整地显示错误信息最好的办法还是两种方法一起用最好!

nfig中也可以把<customErrors mode=On defaultRedirect=ApplicationErroyaspx> <error statusCode= redirect=/> <error statusCode= redirect=/> <error statusCode= redirect=/> </customErrors>

添加进去http错误代码含义 Forbidden Not Found Internal Server Error http错误代码含义大全详解 htmdoshowoneuidtypeblol

方法三Page_Error事件Page_Error 事件提供一种捕获在页级别出现的错误的方法您可以只是显示错误信息(正如下面的示例代码所示)也可以记录事件或执行某个其他操作

备注此示例在浏览器中显示详细的错误信息提供此示例只是为了进行说明向应用程序的最终用户显示详细信息(尤其是该应用程序在 Internet 上运行时)一定要小心更适当的做法是向用户显示一条消息告知已发生错误然后将具体的错误详细信息记录在事件日志中

本示例引发一个强迫错误发生在 Page_Load 事件中的空异常按照以下步骤可创建将测试 Page_Error 事件的初始页 按照以下步骤将名为 PageEventaspx 的新文件添加到项目中 a 打开 Microsoft Visual Studio NET b解决方案资源管理器右键单击该项目节点指向添加然后单击添加 Web 窗体

c 在名称文本框中键入 PageEventaspx然后单击打开

将以下代码添加到 PageEventaspx 中<script language=C# runat=server> void Page_Load(object sender SystemEventArgs e)

{ throw(new ArgumentNullException())} public void Page_Error(object senderEventArgs e)

{ Exception objErr = ServerGetLastError()GetBaseException()string err = <b>Error Caught in Page_Error event</b><hr><br> + <br><b>Error in</b> + RequestUrlToString() + <br><b>Error Message</b> + objErrMessageToString()+ <br><b>Stack Trace</b><br> + objErrStackTraceToString()ResponseWrite(errToString())ServerClearError()} </script>从文件菜单中单击保存 PageEventaspx右键单击该页然后单击在浏览器中查看以运行该页请注意将按照代码规范引发和报告错误

备注您可能注意到代码发出对 ServerClearError 的调用这将防止错误继续到要被处理的 Application_Error 事件中

此外您还应记下 @ Page 指令中的 Inherits 属性如果已经设置 Inherits则必须首先生成项目然后再浏览到该页如果不首先生成项目将看到下面的错误信息 ProjectPageEvent is not a valid type(转)

ASPNET 在处理和响应错误的方式上进行了若干改进在传统的 ASP 中是用On Error Resume Next(或在 Jscript 中用 trycatch 块)处理错误的或者如果您运行的是 Microsoft Internet Information Services (IIS) 则使用 ASPError 对象创建自定义的错误报告页然而这些方法都有其局限性

ASPNET 提供了在运行 ASPNET 应用程序时可能出现的错误的若干处理和响应级别ASPNET 提供三种用于在出现错误时捕获和响应错误的主要方法Page_Error 事件Application_Error 事件以及应用程序配置文件 (nfig)

本文演示如何在 ASPNET 应用程序中使用这些新功能尽管本文由于与 ASPNET 直接相关而介绍了如何提供自定义错误页和一般错误报告但是它并不介绍其他错误处理方法如 trycatchfinally 块和公共语言运行库 (CLR) 异常系统

如何使用 Page_Error 事件Page_Error 事件提供一种捕获在页级别出现的错误的方法您可以只是显示错误信息(正如下面的示例代码所示)也可以记录事件或执行某个其他操作

备注此示例在浏览器中显示详细的错误信息提供此示例只是为了进行说明向应用程序的最终用户显示详细信息(尤其是该应用程序在 Internet 上运行时)一定要小心更适当的做法是向用户显示一条消息告知已发生错误然后将具体的错误详细信息记录在事件日志中

本示例引发一个强迫错误发生在 Page_Load 事件中的空异常按照以下步骤可创建将测试 Page_Error 事件的初始页 按照以下步骤将名为 PageEventaspx 的新文件添加到项目中 a 打开 Microsoft Visual Studio NET b解决方案资源管理器右键单击该项目节点指向添加然后单击添加 Web 窗体

c 在名称文本框中键入 PageEventaspx然后单击打开

将以下代码添加到 PageEventaspx 中<script language=C# runat=server> void Page_Load(object sender SystemEventArgs e)

{ throw(new ArgumentNullException())} public void Page_Error(object senderEventArgs e)

{ Exception objErr = ServerGetLastError()GetBaseException()string err = <b>Error Caught in Page_Error event</b><hr><br> + <br><b>Error in</b> + RequestUrlToString() + <br><b>Error Message</b> + objErrMessageToString()+ <br><b>Stack Trace</b><br> + objErrStackTraceToString()ResponseWrite(errToString())ServerClearError()} </script> 从文件菜单中单击保存 PageEventaspx 右键单击该页然后单击在浏览器中查看以运行该页请注意将按照代码规范引发和报告错误

备注您可能注意到代码发出对 ServerClearError 的调用这将防止错误继续到要被处理的 Application_Error 事件中

此外您还应记下 @ Page 指令中的 Inherits 属性如果已经设置 Inherits则必须首先生成项目然后再浏览到该页如果不首先生成项目将看到下面的错误信息 ProjectPageEvent is not a valid type如何使用 Application_Error 事件与 Page_Error 事件相类似您可使用 Application_Error 事件捕获发生在应用程序中的错误由于事件发生在整个应用程序范围内因此您可记录应用程序的错误信息或处理其他可能发生的应用程序级别的错误

下面的示例基于前面的 Page_Error 事件代码示例如果 Page_Load 事件中的错误未在 Page_Error 事件中捕获将引发异常Application_Error 事件在应用程序的 Globalasax 文件中进行指定为简单起见本节中的步骤创建一个要在其中引发异常的新页捕获 Globalasax 文件的 Application_Error 事件中的错误并将该错误写入事件日志中下面的步骤演示如何使用 Application_Error 事件 将名为 AppEventaspx 的新文件添加到项目中 将以下代码添加到 AppEventaspx 中<script language=C# runat=server> void Page_Load(object sender SystemEventArgs e)

{ throw(new ArgumentNullException())} </script> 从文件菜单中单击保存 AppEventaspx 将 Application_Error 事件添加到 Globalasax 文件中以捕获在 AppEventaspx 页的 Page_Load 事件中引发的错误注意您必须为 SystemDiagnostics 名称空间将另一条 using 语句添加到 Globalasax才能使用事件日志

将以下代码添加到 Globalasax 文件中using SystemDiagnosticsprotected void Application_Error(object sender EventArgs e)

{ Exception objErr = ServerGetLastError()GetBaseException()string err = Error Caught in Application_Error event\n + Error in + RequestUrlToString() + \nError Message+ objErrMessageToString() + \nStack Trace+ objErrStackTraceToString()EventLogWriteEntry(Sample_WebApperrEventLogEntryTypeError)ServerClearError()//additional actions……

} 保存 Globalasax 文件

在 Visual Studio NET 中在生成菜单上单击生成

右键单击该页然后单击在浏览器中查看在这种情况下该页将为空白但是您应该注意到在事件日志中已添加了一个新项本示例在应用程序日志中生成一个项 可从事件查看器访问应用程序日志在记录错误之后您可能希望将用户重定向到另一个更用户友好的错误页或者根据需要执行一些其他操作

如何使用 nfig 文件如果您不调用 ServerClearError 或者捕获 Page_Error 或 Application_Error 事件中的错误则将根据 nfig 文件的 <customErrors> 部分中的设置处理错误在 <customErrors> 部分可将重定向页指定为默认的错误页 (defaultRedirect) 或者根据引发的 HTTP 错误代码指定特定页您可使用此方法自定义用户收到的错误信息

如果发生在应用程序以前的任一级别都未捕获到的错误则显示这个自定义页本节演示如何修改 Globalasax 文件以便从不调用 ServerClearError因此错误在作为捕获错误的最后一点的 nfig 文件中进行处理 从上一个示例中打开 Globalasax 文件

将 ServerClearError 行注释掉以便确保错误出现在 nfig 文件中

将所作更改保存到 Globalasax 中代码看起来应类似如下形式using SystemDiagnosticsprotected void Application_Error(object sender EventArgs e)

{ Exception objErr = ServerGetLastError()GetBaseException()string err = Error Caught in Application_Error event\n + Error in + RequestUrlToString() + \nError Message+ objErrMessageToString() + \nStack Trace+ objErrStackTraceToString()EventLogWriteEntry(Sample_WebApperrEventLogEntryTypeError)//ServerClearError()//additional actions……

} 将以下代码添加到 <customErrors> 部分以便将用户重定向到自定义页<customErrors defaultRedirect= mode=On> </customErrors>备注必须修改 defaultRedirect 属性中的文件路径以便它引用相关的 Web 服务器和应用程序名称

因为在此级别捕获的错误会发送到默认的错误页所以必须创建一个名为  的错误页请记住您要使用此方法来控制向用户呈现的内容因此本示例使用 页作为错误页将以下代码添加到  中<HTML> <HEAD> <TITLE></TITLE> <META NAME=GENERATOR Content=Microsoft Visual Studio > </HEAD> <BODY> <b>Custom Error page!</b> <br> You have been redirected here from the <customErrors> section of the nfig file </BODY> </HTML> 若要测试该代码请保存这些文件生成项目然后在浏览器中查看 AppEventaspx请注意在引发错误时您将被重定向到  页

尽管您可在 <customErrors> 部分中 defaultRedirect 属性的值中引用默认的错误页但是您还可根据引发的 HTTP 错误代码指定要重定向到的特定页<error> 子元素允许使用此选项例如<customErrors defaultRedirect= mode=On> <error statusCode= redirect= /> </customErrors>备 注在 <customErrors> 部分的 defaultRedirect 中指定的页是一个 文件如果您打算在 aspx 页中使用 GetLastError (正如 Page_Error 和 Application_Error 示例那样)则在进行重定向之前必须将异常存储在会话变量或某个其他方法中

请注意<customErrors> 部分包括设置为 On 的 mode 属性mode 属性用于控制错误重定向发生的方式例如如果您正开发应用程序则很可能希望查看实际的 ASPNET 错误信息并且不希望被重定向到更用户友好的错误页mode 属性包括以下设置 ? On未被处理的异常将用户重定向到指定的 defaultRedirect 页此模式主要用于生产? Off用户收到异常信息而不是被重定向到 defaultRedirect 页此模式主要用于开发? RemoteOnly只有在本地计算机上访问该站点的用户(通过使用 localhost)才能收到异常信息所有其他用户都被重定向到 defaultRedirect 页此模式主要用于调试

               

上一篇:十个ASP.NET基础知识问答

下一篇:ASP.NET后台代码实现XmlHttp跨域访问