共有オブジェクトを動的にロードし、共有オブジェクトのコードを実行するかなり大きなアプリケーションがあります。予防策として、私はmain
のほとんどすべてにtry/catchを配置しています。私は3つのもののキャッチを作成しました:myException
(社内例外)、std::exception
、...
(すべての例外をキャッチ)。
共有オブジェクトの実行の一部として、多くのpthreads
が作成されます。スレッドが例外をスローしても、main
はキャッチしません。これは標準的な動作ですか?例外がスローされたスレッドに関係なく、すべての例外をキャッチするにはどうすればよいですか?
Main()はスレッドからスローされた例外をキャッチしますか?
番号
スレッドが例外をスローしても、mainによってキャッチされません。これは標準的な動作ですか?
はい、これは標準的な動作です。
スレッドX
で発生した例外をキャッチするには、スレッドtry
にcatch
-X
句を含める必要があります(たとえば、スレッド内のすべての周りに関数、main
ですでに行っていることと同様)。
関連する質問については、 スレッド間で例外を伝播するにはどうすればよいですか?
あなたの質問は、概念的に不可能である何かを求めています。
Tryブロックは、スタックの動的構成として定義されます。 tryブロックは、その内容から、呼び出しによって動的に到達したコードによってスローされた例外をキャッチします。
新しいスレッドを作成すると、pthread_createの呼び出しがtryの内部にある場合でも、tryブロックの動的コンテキストの一部ではない、まったく新しいスタックが作成されます。
いいえ、メインは他のスレッドからスローされた例外をキャッチしません。説明する方法で処理を集約するには、未処理の例外に対処する非標準のプラットフォーム固有の機能を使用する必要があります。
そのようなアプリケーションを構築するときは、1つのスレッドが失敗した場合にアプリケーション全体が爆発するのを正確に防ぐために、アクティブな各オブジェクトに独自のトップレベルの例外処理ブロックがあることを確認します。プラットフォーム固有のcatchを使用すると、コードやソリューション全体がずさんなものになるのではないかと思います。そんなことはしません。
例外をスローするとスタックが巻き戻されることを考慮してください。各スレッドには独自のスタックがあります。各スレッド関数(つまり、各スレッドのエントリポイント)にtry/catchブロックを配置する必要があります。