我們有一個庫,它處理錯誤報告的許多方面。我一直負責把這個庫移植到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;
}
我的期望是,捕捉到異常:將顯示消息。實際發生的是程序終止,因爲拋出的int沒有捕獲處理程序。
有幾個關於SO的問題似乎有關。 我找到了一些相關的Google網頁。 '智慧'似乎歸結爲。
- 雅不能從信號處理程序拋出異常,導致信號處理器運行自己的堆棧,所以沒有定義處理程序。 Ya可以拋出信號處理程序的異常,只是在棧上重建一個假的 幀,並且你很好。
- 雅,我們一直這樣做。它適用於平臺X上的我
雅,曾經是可用的gcc,但似乎沒有工作任何 更多。嘗試-fnon-call-exceptions選項,也許這將起作用
代碼在我們的AIX/TRU64/MSVC編譯器/環境中按預期工作。它在我們的Linux環境中失敗。
我找了一些建議,幫助解決這個問題,所以在Linux上的庫行爲將與我的其他平臺,或某種或解決方法可能達到相同的排序功能。
讓程序核心轉儲信號,不是一個可行的選擇。
[本文](http://www.ibm.com/developerworks/library/l-cppexcep/)聲稱它的工作原理;它提到了一些修復可能需要,但它似乎並沒有解釋。 – 2014-10-21 09:15:15