我们知道,Server.Transfer在执行时会抛出 ThreadAbortException 。
此外,ThreadAbortException继承Exception:
那么为什么异常不会进入catch块:
try
{
Server.Transfer("NoPremissionSell.aspx");
}
catch (Exception e)
{ }
虽然它会在:
try
{
Server.Transfer("NoPremissionSell.aspx");
}
catch (ThreadAbortException e)
{ }
这适用于两种情况。我不知道它为什么以前没用。 请忽略。
抱歉误导。答案 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();
}
}
}
您是如何测试异常是否被捕获?