0

開発したc++ライブラリに問題があります。独自の例外クラス(基本的にはwhat()呼び出しに返される文字列のみが含まれています)を定義しました。例外がキャッチされない場合の目標は、オペレーティングシステムがwhat()からのメッセージを出力して終了します。これはLinuxではうまく機能しますが、osXでは例外メッセージは表示されません(つまり、何も出力せずに直接終了します)。

それで、キャッチされなかった例外がwhat()の後に終了をもたらすと正しく想定していますか?メッセージが表示されるようにosXで何をすべきですか?(例外ハンドラーを設定するという考えは好きではないことを知っています。これは、ライブラリーのユーザーにそれを行わせるためです)

ありがとう!マティアス

4

2 に答える 2

0

すべてのOSで:例外をキャッチし、main()適切なメッセージを出力します。あなたがそれを捕まえなければ、デストラクタが途中で実行されるかどうかは特定されていません。本当に欲しいですか?

于 2012-09-21T19:10:51.993 に答える
0

それで、キャッチされなかった例外が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
}

ingの代わりに、本当に言いたい、_exitまたはabort(または)したい場合は、もちろんそれを行うことができます。しかし、あなたが知らないなら、あなたはおそらく欲しいでしょう。terminateexitexit

その間:

…例外ハンドラを設定するという考えは好きではないことを知っています。これは、ライブラリのユーザーに例外ハンドラを設定するように強制するためです。

あなたは図書館を書いていますか?そして、ライブラリがアプリケーションの背後でプロセスを終了できるようにしたいですか?

それはおそらく非常に悪い考えです。

しかし、本当にやりたいのであれば、上記と同じコードが機能します。ライブラリへのエントリポイントをラップするのではなく、ラップするだけですmain

于 2012-09-21T19:26:26.903 に答える