我试图更多地了解异常。我在AppDelegate中安装了未捕获的异常处理程序:
// in applicationDidFinishLaunching:
NSSetUncaughtExceptionHandler(&HandleExceptions);
...
void HandleExceptions(NSException *exception) {
// Save application data on crash
[appDelegate saveData];
}
所以我不完全确定这是如何工作的。假设我超出范围访问数组,这将引发异常。为什么不调用此方法?还是说在从表中插入或删除行后引发断言异常-在这种情况下如何在应用崩溃之前保存数据?
通常,当系统引发异常时,如何在应用程序崩溃前有机会保存数据?还是那样行不通?未捕获的异常处理程序是否仅适用于我抛出的未包裹在@catch或@try中的异常?
最佳答案
调用您的方法时,“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