1

別のスレッドのあるスレッドからスローされた例外をキャッチすることは可能ですか?たとえば、私はメインスレッドからスレッドを生成しています。生成されたスレッドは、キャッチされない例外をスローする可能性があります。産卵スレッドがこれらの例外をキャッチすることは可能ですか?Objective-Cの別のスレッドのあるスレッドからスローされた例外を捕捉できますか?

解決策の1つは、スポーンされたスレッドのエントリポイントから例外をキャッチし、NSNotificationを送信して例外を処理することです。それから、産卵スレッドはNSNotificationを聞くことができます。しかし、この解決法は基本的に@catch句をNSExceptionという異なるタイプのパラメータとして再実装しているため、ややこしいものです。私は他の解決策があるかどうかを確認したいと思っていました。

+2

例外は* iOS/Mac OS X *での回復不可能なエラーを示すためにのみ使用されています。回復可能なものについて例外を使用している場合は、間違っています。 – bbum

+1

回復不能なエラーに対してのみ例外を使用することは*慣例*であり、それ自体が間違っている*ではありません。例外の使用には、Obj-C(b)リソースリーク(b2)メモリリークでパフォーマンスが低下するという一般的な3つの異論があります。 (b)は、言語に依存しない例外ベースの設計で扱われなければならず、(b2)の取り扱い((b)のサブセット)は、ガベージコレクション、Obj-C++のARC、または '-fobjc-arc-exceptions'を使用したObj-CのARCをサポートしています。したがって、例外を正しく使用している場合は、「間違っている」わけではありません。あなたのQは@Sevaを参照してください。 – CRD

+0

@bbumこれは「回復不能な」状況です。 –

答えて

3

これは不可能で無意味です。スローするスレッドは、生成中のスレッドが現在tryブロック内で実行されているかどうかを知る方法がありません。そうでない場合は、どうしますか?スポーナーがキャッチする気になるまでスローするもしそれが決してしなければ?

別のシナリオを考えます。また、spawnerスレッドが何かをしている間にワーカースレッドに例外がスローされ、不整合な状態になっているようなことがあります。たとえば、データ構造の更新の途中です。例外は、実行の流れを壊し、データを前記一貫性のない状態のままにする。言い換えれば、スポーナーがやっていた他のどのような良い仕事も永遠に不完全なままであることは言うまでもない。

これは、ワーカースレッドの最上位レベルにキャッチして、[NSObject performSelector:]のようなものを使用してスポーナースレッドに渡すことです。スポンサーがスポンサーのボブーについて通知されるべきであるという一般的な考え方は堅実ですが、スポンサーの例外をスポンサーに投げることは正しくありません。注 - ココアが提供する他の仕組みを通り過ぎるのではなく、私は「投げている」と言いました。

+0

何もする必要はありません。スタックのどこかにtryブロックが存在するかどうかを知らずに例外をスローすることができます。 –

+1

+1の例外はスタックベースのメカニズムであり、すべてのスレッドには独自のスタックがあります。できることはスレッド内の例外をキャスティングして、その情報を通知することだけです。 –

+0

遭遇することのない例外がプロセスをクラッシュさせます。それが望ましい結果ですか? –

関連する問題