ThreadAbortException有什么特别之处?

时间:2012-09-10 09:56:50

标签: c# asp.net .net-4.0

我们知道,Server.Transfer在执行时会抛出 ThreadAbortException

此外,ThreadAbortException继承Exception:

enter image description here

那么为什么异常不会进入catch块:

  try
   {
         Server.Transfer("NoPremissionSell.aspx");
   }

  catch (Exception  e)
   { }

虽然它会在:

  try
   {
         Server.Transfer("NoPremissionSell.aspx");
   }

  catch (ThreadAbortException e)
   { }

编辑,

这适用于两种情况。我不知道它为什么以前没用。 请忽略。

抱歉误导。

3 个答案:

答案 0 :(得分:5)

.NET运行时(命令语言基础结构,CLI,处理程序集执行的基础)对许多异常类型的处理方式不同。

EG。无法通过.NET代码在所有中捕获StackOverflowException

原因取决于例外情况。在StackOverflowException的情况下,因为CLI无法保证进程状态的正确性。

ThreadAbortException的情况下,特殊处理是因为虽然它可以被捕获但必须重新抛出(自动),因此线程将结束。

答案 1 :(得分:2)

ThreadAbortException的特殊之处在于,即使它被捕获,它也会自动被重新抛出。线程已中止。除非调用Thread.ResetAbort,否则代码可以清理但不会停止中止。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx

答案 2 :(得分:2)

你不能通过catch(Exception)捕获ThreadAbortException。

以下代码打印“Handled Exception:Thread is aborted。”,证明异常确实被抓住了:

using System;
using System.Threading;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                test();
            }

            catch (Exception ex)
            {
                Console.WriteLine("Handled Exception: " + ex.Message);
            }
        }

        static void test()
        {
            Thread.CurrentThread.Abort();
        }
    }
}

您是如何测试异常是否被捕获?