それで、キャッチされなかった例外が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
(または)したい場合は、もちろんそれを行うことができます。しかし、あなたが知らないなら、あなたはおそらく欲しいでしょう。terminate
exit
exit
その間:
…例外ハンドラを設定するという考えは好きではないことを知っています。これは、ライブラリのユーザーに例外ハンドラを設定するように強制するためです。
あなたは図書館を書いていますか?そして、ライブラリがアプリケーションの背後でプロセスを終了できるようにしたいですか?
それはおそらく非常に悪い考えです。
しかし、本当にやりたいのであれば、上記と同じコードが機能します。ライブラリへのエントリポイントをラップするのではなく、ラップするだけですmain
。