为什么无法以这种方式捕获工作线程的异常?

时间:2019-06-27 14:16:04

标签: c# .net multithreading exception

下面是我的代码:

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指令将其注册到异常处理程序表中。该表由操作系统管理。异常表将每个处理程序映射到一个异常。每个异常都映射到调用堆栈。因此,异常和捕获处理程序仅限于显式调用堆栈。由于处理程序可以访问线程本地内存,因此它也必须是副本。这意味着每个线程都“知道”其捕获处理程序。

如果是这种情况,那么为什么不处理异常?

0 个答案:

没有答案