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

C++ program terminates without executing the catch block

本文关键字:情况下 终止 catch 执行 程序 c++      更新时间:2023-10-16

我正在使用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()退出程序,它(与你的实现,即编译器/库)产生一个SIGABRT(值6)信号。

问题是,abort()不需要——通常也不会——抛出c++异常(因为它继承自C语言,而C语言对c++异常一无所知)。类似地,引发SIGABRT信号(你的实现在abort()中使用的方法)以一种与c++异常无关的方式退出程序。

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

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