私の経験と一致するドキュメントは見つかりませんでした。
私が欲しいのは、バックグラウンド スレッドで Uncaught-Exceptions を適切に処理する方法です。この「方法」により、アプリはクラッシュしますが、クラッシュする前にいくつかの非常に基本的な操作を実行します (たとえば、次の起動時に調べることができるように値を UserDefaults に保存し、さらにログを記録します)。
メイン スレッドで、 uncaughtExceptionHanlderをセットアップしただけで、これは正常に機能します。ただし、バックグラウンド スレッド (NSOperationQueue で NSOperation として実行される) では、例外が発生しますが、アプリは終了しません: Crashing。アプリは引き続き破損した状態で実行されます。
ただし、Threading Programming Guide には次のように記載されています。
例外ハンドラの設定 アプリケーションが例外をキャッチして処理する場合、発生する可能性のあるすべての例外をキャッチできるようにスレッド コードを準備する必要があります。例外が発生する可能性がある時点で例外を処理するのが最善ですが、スローされた例外をスレッドでキャッチできないと、アプリケーションが終了します。スレッド エントリ ルーチンに最後の try/catch をインストールすると、不明な例外をキャッチして、適切な応答を提供できます。
機能するメソッドの 1 つ (以下) は、try/catch を使用してスレッド呼び出しメソッドを埋め込み、例外の場合はログに記録してから abort() を呼び出すことです。しかし、これが最善の方法とは言えません。例外をメイン スレッドに送信し、キャッチされていない例外ハンドラーによって処理されるようにしたいと考えています。誰かがこれをしましたか?
- (void)threadMethod
{
@try
{
NSArray* aTest = [NSArray array];
[aTest objectAtIndex:10];
}
@catch (NSException* e)
{
// Save to state to User Defaults.
// Log any needed info.
abort();
}
@finally
{
}
}
参考までに: XCode 4.5 SDK を使用して、iOS6 で実行しています。