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()
的原因可能会更有成效。换句话说,确保它断言的条件是有效的。要弄清楚如何做到这一点,您需要阅读所调用函数的文档。
我是运行一个使用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()
的原因可能会更有成效。换句话说,确保它断言的条件是有效的。要弄清楚如何做到这一点,您需要阅读所调用函数的文档。