7

私の経験と一致するドキュメントは見つかりませんでした。

私が欲しいのは、バックグラウンド スレッドで 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 で実行しています。

4

2 に答える 2

6
  1. によって実行されるスレッドは、によってNSOperationQueue管理されています。これによりlibdispatch、例外がトラップされ、 が呼び出されterminate、アプリが終了します。異なる動作が見られる場合は、すでに何か間違ったことをしています。
  2. 例外の後にデータを保存することNSUserDefaultsは、あいまいな命題です。Cocoa は例外をプログラマ エラーとしてのみ処理するため、いったん例外がスローされると、それ自体を使用可能な状態のままにしようとはしません。要するに、あたかも async-signal-safe API のみが利用可能であるかのように、「実際の」クラッシュと同じように扱う必要があります。この点で、Objective-C はすべて自動的に除外されます。
  3. あなたの質問は、クラッシュ レポートを作成しようとしていることを示唆しています。この目的のために、 PLCrashReporterなどのクラッシュ レポート ソリューションをお勧めします。HockeyAppCrashlyticsTestFlightQuincyKitなど、クラッシュ レポートを組み込んだ分析および配信サービスも多数あります。他にもありますが、どれが適切かは、ニーズによって異なります。それらはすべて、クラッシュや例外を安全に処理し、後で使用するためにデータを保存することに関連するすべてのトリッキーな問題に対処します。
于 2013-01-12T23:18:14.557 に答える
0

あなたがしていることについては、2番目のスレッドで起こっていることをチェックするコードがメインスレッドに必要になると思います。実際にメイン スレッドに接続してバックグラウンド スレッドからイベントを発生させることができないため、メイン スレッドで時々チェックする何かを書き込んで行き詰まる可能性が高くなります。そうは言っても、おそらく NSNotificationCenter を使用して、バックグラウンド スレッドから例外がスローされたときにメイン スレッドにイベントを発生させることができます。幸運を。

于 2013-01-13T01:11:10.523 に答える