簡體   English   中英

osX上的C ++未捕獲異常

[英]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
}

如果您真的想_exitabort (甚至terminate )而不是exit ,則可以這樣做。 但是,如果您不知道,則可能要exit

與此同時:

…知道我不喜歡設置異常處理程序的想法,因為這迫使圖書館的用戶去做

你在寫圖書館嗎? 您是否希望您的庫能夠終止應用程序背后的進程?

那可能是一個非常糟糕的主意。

但是,如果您確實想這樣做,則可以使用上面相同的代碼,只需將其包裝在庫的入口點周圍,而不是在main周圍即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM