c++ - 我可以捕获在 main() 之前抛出的异常吗?

标签 c++ exception terminate

我有一些库(实际上是用不同编译器编译的 tbb 库),在 main() 正确启动之前抛出异常。有办法捕捉到它吗?

int main() { std::cout << "Hello World" << std::endl; }

给予

terminating with unexpected foreign exception
Abort (core dumped)

如果我链接到所述库(本例中未使用,但在其他代码中会使用)。

最佳答案

一般来说,在标准 C++ 中不可能捕获在构造全局变量(在任何函数范围之外)期间抛出的异常。

我相信最接近的可能性是对静态构造函数的主体使用函数尝试 block 。

 class MyStatics
 {
      public:

          MyStatics();

      private:

          X x;    // construction may fail
          Y y;    // construction may fail
            // etc
 };

 static MyStatics all_my_statics;

 MyStatics::Mystatics() : x(), y()   // implement using a function try block
 try
 {
     if (some_condition) throw some_exception();   // construction may even fail here
 }
 catch (SomeException &)
 {
     // handler for SomeException
 }

如果在 all_my_statics 的构造过程中抛出异常,那么它的任何完全构造的成员都将被销毁(即 MyStatics 成员在这样的 中不存在>catch block )。

在报告捕获到的异常之后,catch block 中没有太多选项。主要选项将是;

  • 抛出(或重新抛出)异常(因为 MyStatics 的构建失败)。该异常将导致调用 std::terminate()
  • 以其他一些被认为“更干净”的方式终止程序。

吞下在静态构造期间抛出的异常不是一个好主意,因为程序(例如在 main() 中)将没有迹象表明它所依赖的静态没有被正确构造.

更常见的做法是将静态对象放在函数中

  X &the_x()
  try
  {
       static X thing;
       return thing; 
  }
  catch (Whatever &)
  {
       // handler
  }

请记住,每次调用 the_x() 都会尝试构造 thing 直到其中一个成功(即如果第一次抛出异常,则第二次抛出异常调用将尝试构造 thing 等)。但是,如果可以识别程序中第一次调用 the_x() 并捕获异常(即将其包装在 try/catch) 没有必要从后续调用中捕获异常 - 因为,如果第一次调用没有抛出,则 thing 的构造已经成功,并且不会再次构造它。

关于c++ - 我可以捕获在 main() 之前抛出的异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42089465/

相关文章:

C 程序在按 escape 时终止

c++ - 是否应该捕获 boost::asio::io_service::run() 抛出的异常?

python - 使用 KeyboardInterrupt 终止子进程

c++ - 在 C 中使用 _EXFUN ()

c++ - 父级的 HWND 无效

java - Camel捕获在karaf上运行的jdbc异常ClassNotFound

java - 哪个更好/更有效 : check for bad values or catch Exceptions in Java

python - 确实返回停止python脚本

c++ - g++: array bound 不是整数常量

c++ - 在以下程序中使用 C++ 获取 SIGABRT