[英]c++ uncaught exceptions on osX
我開發的c ++庫有一個問題:我定義了自己的異常類(基本上只包含要返回what()調用的字符串),當未捕獲到異常時,目標是操作系統將從what()打印消息並終止。 這在Linux上運行良好,但在osX上,未顯示異常消息(即,它直接終止而不打印任何內容)。
因此,我是否正確地假設未捕獲的異常會導致what()之后終止? 我應該在osX上做什么以便顯示該消息? (知道我不喜歡設置異常處理程序的想法,因為這強加了庫的用戶執行此操作)
謝謝! 馬蒂亞斯
在所有操作系統上:在main()
捕獲異常並打印出適當的消息。 如果您不了解它,則不確定析構函數是否在出口運行。 你真的想要那個嗎?
因此,我是否正確地假設未捕獲的異常會導致what()之后終止?
不需要。標准不需要未捕獲的異常即可打印出what()
。 實際上,它們使編寫一個始終如此的一致性實現變得非常困難(但並非不可能)。
確實沒有一種很好的方法來精確地執行您想做的事情(打印出what()
,只有在這種情況下實現不這樣做的情況下,然后繼續執行terminate()
就像從未發生過異常一樣抓住)。 但這可能不是您真正想要的。
這可能是您想要的:
#import <exception>
#import <iostream>
int real_main(int argc, char *argv[]);
int main(int argc, char *argv[]) {
try {
return real_main(argc, argv);
} catch (std::exception &e) {
std::cerr << "exception: e.what()" << "\n";
exit(1);
} catch (...) {
std::cerr << "exception not derived from std::exception\n";
exit(1);
}
}
int real_main(int argc, char *argv[])
{
// real main code goes here
}
如果您真的想_exit
或abort
(甚至terminate
)而不是exit
,則可以這樣做。 但是,如果您不知道,則可能要exit
。
與此同時:
…知道我不喜歡設置異常處理程序的想法,因為這迫使圖書館的用戶去做
你在寫圖書館嗎? 您是否希望您的庫能夠終止應用程序背后的進程?
那可能是一個非常糟糕的主意。
但是,如果您確實想這樣做,則可以使用上面相同的代碼,只需將其包裝在庫的入口點周圍,而不是在main
周圍即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.