ASP.NET
错误处理方法归结(方法1):page_error
事件 最近接触这方面的知识比较多,从网上搜集了些资料,总结出来,供大家参考,有不妥的地方,还请大家多多指正。言归正传,ASP.NET 提供了三种用于在出现错误时捕获和响应错误的主要方法:page_error 事件、application_error 事件以及应用程序配置文件 (fig)。这三种方法的主要作用无非是创建自定义的错误报告,创建自定义错误报告的作用无非是:出于安全方面的考虑,还有就是为了向用户展示友好的错误页面,提高程序的友好性。话不多说,首先介绍ASP.NET提供的第一种错误处理方法:Page_Error 事件,现举例说明如下: Page_Error 事件提供了一种捕获页面级错误的方法。对于错误的处理,您可以只是显示错误信息(正如下面的示例代码所示),也可以记录事件或执行某个其他操作。
备注:此示例在浏览器中显示了详细的错误信息,提供此示例只是为了进行说明。向应用程序的最终用户展示出错的详细信息是非常危险的(尤其是web程序)。更适当的做法是向用户显示一条消息,告知其已发生错误,然后将具体的错误信息记录在事件日志中。奥运会知识
本例是在Page_Load事件中有意引发一个空异常来测试Page_Error 事件的。
举例:创建web程序 — 新建页面PageEvent.aspx,然后将以下代码添加到PageEvent.aspx中:
<script language="C#" runat="server">
void Page_Load(object sender, System.EventArgs e)
{
// 引发“空引用”异常
throw (new ArgumentNullException());
}
水解度
public void Page_Error(object sender, EventArgs e)
{
Exception objErr = Server.GetLastError().GetBaseException(); // 获取错误
string err = "1.error in: " + Request.Url.ToString() + "</br>" +
"2.error Message: " + objErr.Message.ToString() + "</br>" +
"3.stack Trace: " + objErr.StackTrace.ToString() + "</br>";
Response.Write(err.ToString()); //输出错误信息
// Response.Redirect("ErrorPage.htm"); //可以重定向到友好的错误页面
Server.ClearError();
}
</script>
保存,右击该页面 —“在浏览器中查看”,即可看到捕获到的自定义错误信息。
ASP.NET错误处理方法归结(方法2):Application_Error 事件
今天来归结一下ASP.NET错误处理方法2:Application_Error 事件。举例如下:
与 Page_Error 事件相类似,您可使用 Application_Error 事件捕获发生在应用程序中的错误。由于事件发生在整个应用程序范围内,因此您可记录应用程序的错误信息或处理其他可能发生的应用程序级别的错误。
新建web程序——新建AppEvent.aspx页面——在该页面中添加如下代码:
<SCRIPT language=C# runat="server">
void Page_Load(object sender, System.EventArgs e)
{
throw(new ArgumentNullException());
}
</SCRIPT>
然后呢,将Application_Error事件添加到Global.asax文件中以捕获在AppEvent.aspx 页的 Page_Load 事件中引发的错误。将以下代码添加到 Global.asax 文件中:
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();
//将捕获的错误写入windows的应用程序日志中,可从事件查看器中访问应用程序日志。
扩散方程 System.Diagnostics.EventLog.WriteEntry("Test2", err, System.Diagnostics.EventLogEntryType.Error);
Server.ClearError(); //清除异常,其他地方不再捕获此异常。
}
保存刚才所做的操作,在 Visual Studio .NET 中,在生成菜单上,单击生成。右键单击该页,然后单击在浏览器中查看。在这种情况下该页将为空白,但是您应该注意到在事件日志中已添加了一个新项。本示例在应用程序日志中生成一个项,可从事件查看器访问应用程序日志。在记录错误之后,您可能希望将用户重定向到另一个用户友好的错误页或者根据需要执行一些其他操作,这些操作可以根据自己的需要来做。
ASP错误处理(错误跳转页 fig) -------使用定制错误页面
虽然我们发送给用户的公用错误信息是安全的,就是说它不会威胁到应用程序的秘密,但是这样的信息并不好看。也许你希望用户永远也看不到这样的信息。相反,当处理请求的
过程中,如果发生了一个为处理的错误,你希望能够显示自己的“定制错误页面”,显示出自己的品牌以及特定的错误信息。
向ASP.NET 应用程序中增加定制错误信息非常容易。首先,编写自己的 web页面,它可以是任何类型的文件:.htm,.aspx,.asp,等等。然后在应用程序的config.web文件中修改配置信息,让它指向这个文件。
举例说明,以下这个配置信息说明在发生了任何未能预定处理错误的情况下,浏览器都应该被重定向到“ErrorPage.aspx”页面:
<configuration>
<customerrors mode="remoteonly" defaultredirect="ErrorPage.aspx" /></configuration>
<customerrors>
标记中的“defaultredirect”属性定义了在发生错误的情况下,用户将被重定向到的“默认”页面。或者,也可以根据响应的http代码状态,重定向到其它的页面来覆盖这个默认值。例
如:重定向到一个特殊的“未到文件”错误页面、“非法访问”错误页面、“服务器冲突”错误页面等等。
举例说明,以下的配置信息覆盖3个特定的http 状态代码,所有其它错误都返回到一个默认页面:
<customErrors mode="RemoteOnly" defaultRedirect="404/404.html">
<error statusCode="500" redirect="404/404.html"></error>
<error statusCode="404" redirect="404/404.html"></error>
<error statusCode="403" redirect="404/404.html"></error>
</customErrors>
在定制错误页面上有一件事我们已经遇到过,那就是虽然它们对于已经完成的情况非常有用,然而在开发过程中却非常难以对付。因为你预想到在开发过程中会有bug,并且当你发现的时候,真的希望看到实际的错误信息跟踪。为了解决这个问题,<customerrors>标记支持一个有3个值的“mode”属性:
“on”:意思是总是发出定制错误页面;
“off”:意思是从不发出定制错误页面(你总是看到原始的错误信息);
“remoteonly”:意思是只有当远程浏览器点击站点时才发出定制错误页面(而在实际机器上点击站点的开发人员看到的是详细的错误信息)。
二,在Global.asax文件中添加应用出错代码,写入系统日志文件孙大愚
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();
//将捕获的错误写入windows的应用程序日志中,可从事件查看器中访问应用程序日志。
System.Diagnostics.EventLog.WriteEntry("Test2", err, System.Diagnostics.EventLogEn
tryType.Error);
Server.ClearError(); //清除异常,其他地方不再捕获此异常。
}