C++ 程序在不执行 catch 块的情况下终止

C++ program terminates without executing the catch block

我是运行一个使用mpi并行的代码 我的程序终止并显示 Assertion (unsigned long)(size) >= (unsigned long)(nb) failed terminated by signal 6

我添加到我的主要 try 和 catch 如下

   int main(int argc, char *argv[])
 {
    MPI_Init(&argc, &argv);
    int rankid;
    MPI_Comm_rank(MPI_COMM_WORLD, &rankid);

    try
    {
      call functions 
     }
    catch(...)
     {
        cout<<"error from "<<rankid<<endl;
        throw;
      }
     return 0;
 }

我正在使用 mpicxx example.C 和 运行 编译我的代码

 mpirun -np 2 ./a.out

我的代码终止时没有打印 catch 中的短语,try and catch 是否应该强制我的程序执行 catch 中的内容

某处,在你的call functions中,可能有assert()的用法。如果断言失败,结果是通过调用 abort() 退出程序,这(通过您的实现,即 compiler/library)生成一个 SIGABRT(值 6)信号。

问题是,abort() 不需要 - 通常也不会 - 抛出 C++ 异常(因为它是从 C 继承的,C 是一种对 C++ 异常一无所知的语言)。同样,发出 SIGABRT 信号(您的实现在 abort() 中使用的方式)以与 C++ 异常无关的方式退出程序。

catch(...) 子句唯一会捕获的是 C++ 异常。它不是用于拦截任何导致程序终止的事件的包罗万象(没有双关语意)。

您可以通过使用 signal() 函数建立适当的信号处理程序来拦截 SIGABRT 信号。在实践中,找出导致 call function 调用 abort() 的原因可能会更有成效。换句话说,确保它断言的条件是有效的。要弄清楚如何做到这一点,您需要阅读所调用函数的文档。