1

例外をもう少し理解しようとしています。AppDelegateにキャッチされない例外ハンドラーをインストールしました。

// in applicationDidFinishLaunching:
NSSetUncaughtExceptionHandler(&HandleExceptions);
...
void HandleExceptions(NSException *exception) {
    // Save application data on crash
    [appDelegate saveData];
}

ですから、これがどのように機能するのか完全にはわかりません。範囲外の配列にアクセスすると、例外がスローされます。このメソッドが呼び出されないのはなぜですか?または、テーブルに行を挿入または削除した後にスローされたアサーション例外があると言います-そのような状況でアプリがクラッシュする前にデータを保存するにはどうすればよいですか?

一般に、システムが例外をスローした場合、アプリがクラッシュする前にデータを保存するにはどうすればよいですか?それともそのようには機能しませんか?キャッチされなかった例外ハンドラーは、@ catchまたは@tryにラップされていない、スローした例外に対してのみですか?

4

1 に答える 1

2

メソッドが呼び出されたとき、おそらく'appDelegate'はnilです。これをviewControllerに追加しました。

void HandleExceptions(NSException *exception) {
    // Save application data on crash
    NSLog(@"YIKES");
}

その後、これを行いました:

NSArray *foo = @[ @1, @2, @3 ];
NSSetUncaughtExceptionHandler(&HandleExceptions);
NSLog(@"%@", [foo objectAtIndex:3]);

そしてこれを手に入れました:

2012-09-06 13:51:17.474 Searcher[64798:f803] YIKES
2012-09-06 13:51:17.475 Searcher[64798:f803] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]'
*** First throw call stack:
(0x67f022 0x1749cd6 0x66b644 0x324d 0xbb8a1e 0xb17401 0xb17670 0xb17836 0xc9addd8 0xb1e72a 0x2fcd 0xaef386 0xaf0274 0xaff183 0xaffc38 0xaf3634 0x2260ef5 0x653195 0x5b7ff2 0x5b68da 0x5b5d84 0x5b5c9b 0xaefc65 0xaf1626 0x2dfc 0x2d95
于 2012-09-06T17:54:13.440 に答える