我们有一个处理许多错误报告方面的库。我被指派将该库移植到Linux。在运行我的小测试套件时,其中一个测试失败了。下面是一个简化版本的测试。
// Compiler: 4.1.1 20070105 RedHat 4.1.1-52
// Output: Terminate called after throwing an instance of 'int' abort
#include <iostream>
#include <csignal>
using namespace std;
void catch_signal(int signalNumber)
{
signal(SIGINT, SIG_DFL);
throw(signalNumber);
}
int test_signal()
{
signal(SIGINT, catch_signal);
try
{
raise(SIGINT);
}
catch (int &z)
{
cerr << "Caught exception: " << z << endl;
}
return 0;
}
int main()
{
try
{
test_signal();
}
catch (int &z)
{
cerr << "Caught unexpected exception: " << z << endl;
}
return 0;
}
我期望的是会显示“Caught exception:”消息。实际上,程序终止了,因为没有为抛出的int设置catch处理程序。
有一些与SO相关的问题。我找到了一些相关的Google页面。这个"智慧"似乎可以归结为:
1.不能从信号处理程序中抛出异常,因为信号处理程序使用自己的堆栈,所以在其上没有定义处理程序。
2.可以从信号处理程序中抛出异常,只需在堆栈上重建一个虚假帧即可。
3.我们经常这样做。它在平台X上对我有效。
4.以前在gcc中可以使用,但现在似乎不再起作用。尝试使用-fnon-call-exceptions选项,也许会起作用。
该代码在我们的AIX/TRU64/MSVC编译器/环境中按预期工作。但在我们的Linux环境中失败了。
编辑:可能相关 - 从硬件异常处理程序中抛出C ++异常。为什么-fnon-call-exceptions的行为与预期不同?