.NET,Response.Redirect 会产生 ThreadAbortException 异常

翟二喜
try
{
    Response.Redirect("otherpage.aspx");
}

.NET Document 说 ThreadAbortException 是一个特殊的异常,在线程处理时我们要用它来判断截获线程中止的消息。Response.Redirect 也会引发这个异常,似乎是引发异常以终止当前页面的执行线程。由于是“特殊的异常”,一些常见的 catch 操作似乎并不能发现它:

catch(Exception ex)
{
}
catch(Exception ex)
{
    throw new Exception(ex.Message);
}
catch(Exception ex)
{
    Response.Write(ex.Message);
}
catch(Exception ex)
{
    Response.Write(ex.Message);
    System.Threading.Thread.ResetAbort(); // 这也不能结束这个 Response.Redirect 产生的“特殊异常”
}

下面的用法,将能看到它:

catch(Exception ex)
{
    Response.Redirect("error.aspx?message=" + ex.Message);
}

如果我们在 catch 中使用了 Response.Redirect 的话,他将会影响 try 中的 Response.Redirect,暂时先不考虑在 try 中以及在 catch 中使用 Response.Redirect 是否得当的问题。目前的解决方法是:

catch(Exception ex)
{
    if (!(ex is ThreadAbortException))
    {
        Response.Redirect("error.aspx?message=" + ex.Message);
    }
}

由此考虑,Response.End() 应该也会引发 ThreadAbortException 异常的。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:2   其中:访客  2   博主  0

  1. OSCAR_NJU 5

    果然如此,谢过了!

  2. winwhl 5

    ex is ThreadAbortException