9

マルチレベルのロギングを実装するいくつかのアプリケーションのフレームワークに取り組んできました。これは主に社内で他のデバイスとの通信をテストするために使用されるアプリケーションで使用されますが、配布する一部のアプリケーションでも使用されます。

キャッチされていない例外をキャッチし、すぐにコードを実行して例外をログ ファイルに保存する方法はありますか? 現時点では、Log クラスは単純にファイルへの書き込みを頻繁に行い、書き込みが失敗した場合などに 2 つのファイルを交互に書き込みます。エントリをファイルに記録し、例外が発生したことに注意してその詳細をログに記録し、アプリをクラッシュさせます。

アプリ全体で未処理の例外をキャッチする方法があれば、次のようになると思います。

appDidReceiveUnhandledException:(NSException *)exception
{
    //write log to disk
    //append exception info to log file
    //rethrow exception
}

これが可能かどうかについて誰かが私に洞察や提案を与えることができれば、それは大歓迎です.

4

3 に答える 3

18

AppDelegate で、アプリケーション全体の未処理の例外ハンドラーを追加できます。

void HandleExceptions(NSException *exception) {
    NSLog(@"The app has encountered an unhandled exception: %@", [exception debugDescription]);
    // Save application data on crash
}

AppDelegate で次のように参照didFinishLaunchingWithOptionsします。

NSSetUncaughtExceptionHandler(&HandleExceptions);
于 2013-03-11T21:30:25.610 に答える
3

呼び出して、独自の例外ハンドラーを設定できます。NSSetUncaughtExceptionHandler()

アプリデリゲートと呼ぶことができます

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

#ifdef DEBUG
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
#endif

...

}

ご覧のとおり、次のような関数に関数ポインタを渡す必要があります。

void uncaughtExceptionHandler(NSException *exception)
{
    NSLog(@"App Crash:\n%@", exception);
    NSLog(@"Stack Trace:\n%@", [exception callStackSymbols]);
}
于 2013-03-11T21:31:19.593 に答える
1

例外ハンドラを設定する必要があります。これは、applicationDidFinishLaunching のアプリ デリゲートで行うのが最適です。つまり、次のようになります。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSSetUncaughtExceptionHandler(&mExceptionHandler);
}

- (void)mExceptionHandler(NSException *exception) {
    NSLog(@"Exception %@", exception);
}
于 2013-03-11T21:31:55.453 に答える