我正在使用 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/