web-dev-qa-db-ja.com

main()はスレッドからスローされた例外をキャッチしますか?

共有オブジェクトを動的にロードし、共有オブジェクトのコードを実行するかなり大きなアプリケーションがあります。予防策として、私はmainのほとんどすべてにtry/catchを配置しています。私は3つのもののキャッチを作成しました:myException(社内​​例外)、std::exception...(すべての例外をキャッチ)。

共有オブジェクトの実行の一部として、多くのpthreadsが作成されます。スレッドが例外をスローしても、mainはキャッチしません。これは標準的な動作ですか?例外がスローされたスレッドに関係なく、すべての例外をキャッチするにはどうすればよいですか?

35
steveo225

Main()はスレッドからスローされた例外をキャッチしますか?

番号

スレッドが例外をスローしても、mainによってキャッチされません。これは標準的な動作ですか?

はい、これは標準的な動作です。

スレッドXで発生した例外をキャッチするには、スレッドtrycatch-X句を含める必要があります(たとえば、スレッド内のすべての周りに関数、mainですでに行っていることと同様)。

関連する質問については、 スレッド間で例外を伝播するにはどうすればよいですか?

46
NPE

あなたの質問は、概念的に不可能である何かを求めています。

Tryブロックは、スタックの動的構成として定義されます。 tryブロックは、その内容から、呼び出しによって動的に到達したコードによってスローされた例外をキャッチします。

新しいスレッドを作成すると、pthread_createの呼び出しがtryの内部にある場合でも、tryブロックの動的コンテキストの一部ではない、まったく新しいスタックが作成されます。

19
bmargulies

いいえ、メインは他のスレッドからスローされた例外をキャッチしません。説明する方法で処理を集約するには、未処理の例外に対処する非標準のプラットフォーム固有の機能を使用する必要があります。

そのようなアプリケーションを構築するときは、1つのスレッドが失敗した場合にアプリケーション全体が爆発するのを正確に防ぐために、アクティブな各オブジェクトに独自のトップレベルの例外処理ブロックがあることを確認します。プラットフォーム固有のcatchを使用すると、コードやソリューション全体がずさんなものになるのではないかと思います。そんなことはしません。

9
Brent Arias

例外をスローするとスタックが巻き戻されることを考慮してください。各スレッドには独自のスタックがあります。各スレッド関数(つまり、各スレッドのエントリポイント)にtry/catchブロックを配置する必要があります。

7
Dabbler