今天做东西,从服务器上将文件response.write出来,但是我怕下载的过程出异常,就对下载的代码加了try/catch,结果文件都已经下再下来了,但是程序却执行到catch里面了,爆出了ThreadAbortException异常,虽说没什么影响,但是自己感觉像吃了苍蝇,很是不爽。晚上琢磨了一下,搞明白了,总结如下:
先看几段代码:
Response.End():


{
try
{
Response.Write( " Default " );
Response.End();
}
catch (Exception ex)
{
int i = 0 ;
}
}
Response.Redirect():


{
try
{
Response.Redirect( " Hello.aspx " );
}
catch (Exception ex)
{
int i = 0 ;
}
}
上面这连段段代码中catch块一直会执行,异常信息为“Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack(由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值)”
很是奇怪,上面的代码没什么问题,但是就是会报异常,如果不加catch,程序也不会报错。
看下面代码:
{
Response.Write( " Default " );
Response.End();
int i = 0 ;
}
上面这段代码压根int i=0压根就不会执行,这是为什么?
今天这个问题困扰了我大半天,今晚终于找到问题的原因了:
Response.End()会终止页面代码的执行,而直接转向Application_EndRequest事件,Response.End()后面的代码是不会执行的。而Response。Redirect()方法最后也会执行Response.End()。所以当其后还有代码时,CLR就会爆出ThreadAbortException。这就是上面问题的产生原因。
那么这些问题应该怎么解决呢?
微软指出:用HttpContext.Current.ApplicationInstance.CompleteRequest 方法来代替Response.End,用
Response。Redirect(url,false)来代替Response。Redirect(url).
现在上面的代码可以这样子写:
Response.End();


protected void Page_Load( object sender, EventArgs e)
{
try
{
Response.Write( " Default " );
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
catch (Exception ex)
{
int i = 0 ;
}
}
Response.Redirect()


{
try
{
Response.Redirect( " Hello.aspx " , false );
}
catch (Exception ex)
{
int i = 0 ;
}
}
经过上面的修改两段代码中catch都不会再执行。问题总算解决了,终于把苍蝇吐出来了
另外Server.Transfer也会在执行完毕之后内部也会执行Response.End,微软建议如果有类似情况,可以用
Server.Execute来代替之。