C ++程序终止而不执行catch块

时间:2016-11-12 08:14:33

标签: c++ try-catch mpi terminate

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

我添加到我的主要尝试并捕获如下

   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中打印短语的情况下终止,是否尝试捕获应该强制我的程序执行catch中的内容

1 个答案:

答案 0 :(得分:2)

在某个地方,call functions中可能会使用assert()。如果断言失败,则结果是通过调用abort()退出程序,SIGABRT(使用您的实现,即编译器/库)生成6(值abort())信号。

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

SIGABRT子句将捕获的唯一内容是C ++异常。拦截任何导致程序终止的事件并不是一个全能(没有双关语)。

您可以使用signal()函数拦截call function信号,以建立适当的信号处理程序。在实践中,找出导致abort()致电<div class="table-responsive"> <table class="table table-hover table-striped"> <thead> <tr> <th>K-ID</th> <th>Name</th> <th>Ort</th> <th></th> </tr> </thead> <tbody> <div id="results"></div> </tbody> </table> <div class="pagination"></div> </div> 的原因可能会更有成效。换句话说,确保它声明的条件有效。要弄清楚如何操作,您需要阅读所调用函数的文档。