try catch中用了 Response.Redirect 引发的线程异常终止
Posted LoveCoder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了try catch中用了 Response.Redirect 引发的线程异常终止相关的知识,希望对你有一定的参考价值。
记录一下,提醒自己。
今天写代码的时候,在try 中写了一句 Response.Redirect
在 catch 把页面重定向到了另外一个地方
本来是想打算,如果没出现异常,就定到页面A,如果异常了就定到页面b,然后发现,尼玛怎么样都去了页面b
本来以为是我try代码块中,访问webService出现了什么异常,单步调试了好久,每次都正常没有错误,但是一到 Response.Redirect 就线程终止
搜了一下资料,解决了。以下是一篇说明。很多地方有,不知道出处了。
如果使用 try 、catch 处理包含Response.Redirect 语句代码,总是能捕捉到异常:线程正在中止,
其实不仅仅Response.Redirect 会,Response.End 和 Server.Transfer 也是一样的情况,本质的原因的原因是Response.End 方法停止页的执行,并将该执行变换到应用程序的事件管线中的 Application_EndRequest 事件, Response.End 后面的代码行将不执行。通常认为Response.End 方法是线程的非正常结束,因此MS就在内部抛出ThreadAbortException 异常,而Response.Redirect 和 Server.Transfer 这两种方法都在内部调用 Response.End。
症状
原因
<!-- Inject Script Filtered -->
此问题出现在 Response.Redirect 和 Server.Transfer 方法中,因为这两种方法均在内部调用 Response.End。
解决方案
对于 Response.End,调用 HttpContext.Current.ApplicationInstance.CompleteRequest 方法而不是 Response.End 以跳过 Application_EndRequest 事件的代码执行。 | |
对于 Response.Redirect,请使用重载 Response.Redirect(String url, bool endResponse),该重载对 endResponse 参数传递 false 以取消对 Response.End 的内部调用。例如:
Response.Redirect ("nextpage.aspx", false);如果使用此替代方法,将执行 Response.Redirect 后面的代码。 |
|
对于 Server.Transfer,请改用 Server.Execute 方法。 |
以上是关于try catch中用了 Response.Redirect 引发的线程异常终止的主要内容,如果未能解决你的问题,请参考以下文章
try,catch,finally和return执行顺序的知识点
Java异常处理机制:try...catch...的执行流程
spring事务管理中,用try-catch处理了异常,事务也会回滚?
java编程用catch(Exception e)捕获异常,在catch中用instanceof对不同的异常分别处理