【问题标题】:Will main() catch exceptions thrown from threads?main() 会捕获线程抛出的异常吗?
【发布时间】:2011-12-05 12:59:28
【问题描述】:

我有一个非常大的应用程序,它可以动态加载共享对象并在共享对象中执行代码。作为预防措施,我对main 中的几乎所有内容都进行了尝试/捕捉。我为 3 件事创建了一个捕获:myException(内部异常)、std::exception...(捕获所有异常)。

作为共享对象执行的一部分,会创建许多pthreads。当一个线程抛出异常时,它不会被main 捕获。这是标准行为吗?如何捕获所有异常,无论它们是从哪个线程抛出的?

【问题讨论】:

    标签: c++ exception-handling pthreads


    【解决方案1】:

    main() 会捕获线程抛出的异常吗?

    没有

    当一个线程抛出异常时,它不会被 main 捕获。这是标准行为吗?

    是的,这是标准行为。

    要捕获源自线程X 的异常,您必须在线程X 中有try-catch 子句(例如,围绕线程函数中的所有内容,类似于您已经在main)。

    有关相关问题,请参阅How can I propagate exceptions between threads?

    【讨论】:

      【解决方案2】:

      您的问题是在要求一些概念上不可能的东西。

      Try 块被定义为堆栈的动态结构。 try 块从其内容中捕获由调用动态到达的代码引发的异常。

      当您创建一个新线程时,您会创建一个全新的堆栈,它根本不是 try 块的动态上下文的一部分,即使对 pthread_create 的调用在 try 中也是如此。

      【讨论】:

        【解决方案3】:

        不,main 不会捕获从其他线程抛出的异常。您需要使用非标准的、特定于平台的工具来处理未处理的异常,以便按照您描述的方式聚合处理。

        当我构建这样的应用程序时,我确保每个活动对象都有自己的顶级异常处理块,以防止在一个线程失败时整个应用程序爆炸。我认为使用特定于平台的捕获所有内容都要求您的整体代码/解决方案草率。我不会用这样的东西。

        【讨论】:

          【解决方案4】:

          考虑抛出异常会展开堆栈。每个线程都有自己的堆栈。您必须在每个线程函数中放置一个 try/catch 块(即在每个线程的入口点)。

          【讨论】:

            猜你喜欢
            • 2011-06-25
            • 1970-01-01
            • 2011-08-21
            • 1970-01-01
            • 2011-08-24
            • 1970-01-01
            • 1970-01-01
            • 2017-11-25
            相关资源
            最近更新 更多