http://blog.csdn.net/helloxiaoyu/article/details/2943537
此篇文章描述了当异常再ASP.NET中发生时怎样使用C#.NET代码去拦截和相应异常。ASP.NET在异常处理方面比传统的ASP更优越。在ASP.NET中,允许在应用程序的各个层面中处理异常。
ASP.NET的新特性
ASP.NET为捕获并处理异常提供了更多的便利。在传统的ASP程序中,我们用“On Error Resume Next”(或Jscript的Try-catch)来处理异常。另一个方法是如果你运行IIS5.0的话,使用ASPError对象去创建一个自定义的错误页面,然而,这些方法有他们的局限性.
当一个ASP.NET应用程序出错的时候,ASP.NET提供一些能够捕捉和处理这些异常的办法。ASPNET提供三个主要的方法允许你捕捉和处理错误,当错误发生时:Page_Error事件 Application_Error事件,和应用程序配置文件(Web.config)
此篇文章旨在演示怎样在你的ASPNET应用程序使用这三个新功能。但是此篇文章不对其他的异常处理方式进行描述,如:try-catch-finally,和CLR(Common Language Runtime)异常处理系统。
怎样使用Page_Error事件
Page_Error事件提供一种拦截页面层异常的方法.你可以简单的显示错误信息(见示例),或者记入日志又或者执行其他的动作.
注意:这个例子演示了怎样在浏览器中显示详细的错误信息.需要注意的是显示详细的错误信息给用户不是一个好办法,特别是当应用程序在Internet上运行的时候.更适合的方法是显示一个信息给用户通知他们一个错误发生,然后将错误的详细信息记入日志.
这个例子抛出一个null exception,强制异常出现在Page_Load事件中.按照如下步骤创建测试Page_Error事件的页面.
按照如下的步骤在您的项目中创建一个名为PageEvent.aspx的新文件:
打开VisualStudio.NET
在解决方案浏览器中,右击项目节点,指向添加,然后点击添加新窗体.
在名称文本框中,输入PageEven.aspx,然后点击Open.
将下面的代码添加到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 = "<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();
}
</script>
在文件菜单中,单击保存.
右击这个页面,然后单击在浏览器中浏览以运行此页面.异常会按照我们预想的抛出,并且被上面的代码所处理.
注意:你可能注意到这个代码调用了Server.ClearError方法.这个方法阻止异常传递到Application_Error事件中.
此外,你应该注意@Page标签的Inherits属性。如果Inherits被设置,你应该首先编译整个项目,否则在浏览此页面的时候你将收到如下错误信息: 'Project.PageEvent' is not a valid type
怎样使用Application_Error事件
与Page_Error相似,你可以使用Application_Error事件在你的应用程序中拦截异常由于此事件的应用程序级作用范围,你可以将错误信息记录入日志,或者处理其它的可能发生的应用程序级别的异常.
下述示例源自前述的Page_Error事件代码,并且当Page_Load事件中的异常没有被Page_Error事件处理的时候被激发.Application_Error事件被指定在Global.asax文件中.为简化,下述步骤创建了一个新的页面并且抛出一个异常,在Global.asax文件中Application_Error事件里拦截和处理这个异常,将错误写入日志.下述步骤演示了怎样使用Application_Error事件:
在你的项目中添加一个名为AppEvent.aspx的文件.
将下述代码添加到AppEvent.aspx文件中:
<script language=C# runat="server">
void Page_Load(object sender, System.EventArgs e)
{
throw(new ArgumentNullException());
}
</script>
<script language=C# runat="server">
void Page_Load(object sender, System.EventArgs e)
{
throw(new ArgumentNullException());
}
</script>
保存.
将Application_Error添加到Global.asax文件中以拦截在ApEvent.aspx文件中抛出的异常.注意,你必须在Global.asax文件中添加对System.Diagnostics命名空间的引用才能使用事件日志.
将如下代码添加到Global.asax 文件中:
using System.Diagnostics;
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();
EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
Server.ClearError();
//additional actions...
}
保存.
编译.
运行
怎样使用Web.config 文件
如果你没有在调用Server.ClearError方法,或者在Page_Error或Application_Error方法中捕获异常,那么异常会按照Web.config文件中<customErrors>区段的使者被处理.在<customErrors>区段中,你可以指定一个默认的错误导向页面(defaultRedirect)或指定一个特定的HTTP页面错误代码.你可以使用此方法自定义用户接收到的错误代码.
如果错误在应用程序的各个级别都没有被捕获,那么自定义页面就会显示.此节说明了怎样编辑Global.asax文件以保证Server.ClearError方法不会被调用.因此,异常才会被Web.congif文件作为最后一环异常处理方法被捕捉.
打开上一个例子的Global.asax 文件.
注释掉Server.ClearError 行.
保存,你的代码应该看起来像下面的代码:
using System.Diagnostics;
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();
EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
//Server.ClearError();
//additional actions...
}
添加下面的代码加入以此来将用户重定向到自定义的页面:
<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
</customErrors>
注意: 你必须修改defaultRedirect 属性以关联你自己的应用程序页面..
由于在此层面被拦截的异常被发送到一个默认的错误页面,你必须创建一个错误页面并且命名为ErrorStatus.htm. 请记住你使用此方法是在控制那些能够呈现给用户的东西,所以这个例子使用了一个html文件充当错误页面。将下面的代码添加到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属性设置的是HTML页面.如果你想在一个aspx文件中调用Server.GetLastError方法的话(像上面Page_Error和Application_Error的例子),你必须在重定向之前将异常储存在Session变量中或其他合适的地方.
Notice that the <customErrors> section includes a mode attribute that is set to On. The mode attribute is used to control how the error redirection occurs. For example, if you are developing the application, you most likely want to see the actual ASP.NET error messages and do not want to be redirected to the more user-friendly error page. The mode attribute includes the following settings:
<customErrors>区段包括一个被设置为ON的Mode属性.这个属性是用来控制错误重定向的方式.举个例子,如果你在开发一个Web应用程序,你可能希望看到实际的ASPENET错误信息,而不希望被重定向到一个用好的错误页面.这个属性包括如下设置:
On: 未被处理的异常发生时将用户重定向到defaultRedirect 属性设置的页面.多数用在产品.
Off: 用户会开到详细错误信息,并且不会被重定向到指定的错误页面.这个设置多数用在开发过程中..
RemoteOnly: 只有当本地计算机访问的时候(localhost)才能获得异常的详细信息.其它的用户会被重定向到指定的错误页面.主要用在处错过程中.
asp.net中c# 怎么做当上传打文件时提示上传文件太大不能上
http://bbs.csdn.net/topics/380249577
Web上传文件的原理及实现
http://www.cnblogs.com/nokiaguy/archive/2008/05/29/1209858.html