2

众所周知,Server.Transfer在执行时会抛出ThreadAbortException 。

此外, ThreadAbortException 继承 Exception :

在此处输入图像描述

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

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

  catch (Exception  e)
   { }

虽然它会在:

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

  catch (ThreadAbortException e)
   { }

编辑 ,

这在两种情况下都有效。我不知道为什么它以前不起作用。请忽略。

抱歉误导。

4

3 回答 3

5

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

例如。.NET 代码根本StackOverflowException无法捕获。

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

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

于 2012-09-10T10:01:20.537 回答
2

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

于 2012-09-10T10:01:23.703 回答
2

不能通过 catch (Exception) 捕获 ThreadAbortException 是不正确的。

下面的代码打印“Handled Exception: Thread was being 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();
        }
    }
}

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

于 2012-09-10T10:08:41.950 回答