1. ホーム
  2. c++

[解決済み] C++の処理されない例外

2022-02-25 05:59:30

質問

C++は、処理されない例外が発生した場合に、何か視覚的なものを「表示」する方法を提供していますか?

私がしたいのは、次のようなものを作ることです。 assert(unhandled exception.msg()) が実際に発生した場合(以下のサンプルのように)。

void foo() {
   throw std::exception("Message!");
}

int main() {
 foo();
}

この種のコードは、(例外が処理されなかったので) すぐに終了するのではなく、カスタムアサーションメッセージ ( Message! 実際には)。

そんなことが可能なんですか?

どのように解決するのですか?

キャッチできない例外のメッセージを実際に表示する方法は、標準では規定されていません。しかし、多くのプラットフォームでは、とにかくそれが可能なのです。Windowsでは、SetUnhandledExceptionFilterを使用して、C++の例外情報を引き出すことができます。g++(の適切なバージョン)では、terminate handlerは以下のようなコードでキャッチされない例外にアクセスできます。

   void terminate_handler()
   {
       try { throw; }
       catch(const std::exception& e) { log(e.what()); }
       catch(...) {}
   }

で、実際に g++ のデフォルトの terminate ハンドラはこれと似たようなことをします。set_terminate で終了ハンドラを設定することができます。

要するに、C++の一般的な方法はないのですが、プラットフォームによって方法はあるのです。