下面是我的代码:
class Program
{
static void Main(string[] args)
{
try
{
Thread t = new Thread(new ThreadStart(Test));
t.Start();
}
catch (Exception ex)
{
Console.WriteLine("catched");
}
}
static void Test()
{
int s = 0;
int i = 1 / s;
}
}
运行控制台应用程序时,发生未处理的异常,这意味着辅助工作线程未捕获其异常。
我最初虽然理解为什么会这样:每个线程都有自己的堆栈,所以工作线程不会知道它被try catch块包围,这就是为什么无法处理其异常的原因。
但是有人回答了我的earlier question并提到:
说每个线程都有专用的调用堆栈时,您是对的。但是,当您编写应该同时执行的代码时,则会在堆上为每个线程创建所有本地变量的副本。对于try-catch块也是如此。 Catch指示编译器定义一个处理程序(指令指针),然后通过try指令将其注册到异常处理程序表中。该表由操作系统管理。异常表将每个处理程序映射到一个异常。每个异常都映射到调用堆栈。因此,异常和捕获处理程序仅限于显式调用堆栈。由于处理程序可以访问线程本地内存,因此它也必须是副本。这意味着每个线程都“知道”其捕获处理程序。
如果是这种情况,那么为什么不处理异常?