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

标签 c++ try-catch mpi terminate

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

我添加到我的主要 try and 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 中的内容

最佳答案

某处,在您的调用函数中,可能使用了assert()。如果断言失败,结果是通过调用 abort() 退出程序,这(通过您的实现,即编译器/库)生成一个 SIGABRT(值 6 ) 信号。

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

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

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

关于C++ 程序在不执行 catch block 的情况下终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40560909/

相关文章:

c++ - 使用 D3DXLoadSurfaceFromMemory 加载 BITMAP

r - 异常处理 RSelenium switchToFrame() 错误 : ElementNotVisible

r - parApply 中的错误处理(在 R 中,使用并行包)

c - MPI_Scatter 无法正常工作

c - 打开 MPI 错误在头文件中定义 MPI_Datatype

c++ - 在 C++ 应用程序中使用 boost 的问题

c++ - 我应该明确截断吗?

Flutter 和 Dart 尝试 catch——catch 不会触发

fortran - MPI_SCATTER Fortran 矩阵(按行)

java - 为什么 `++a++` 不能用 C++ 编译但 `(++a)++` 可以?