【问题标题】:Handling UITableView or NSArray exceptions?处理 UITableView 或 NSArray 异常?
【发布时间】:2012-09-06 15:00:53
【问题描述】:

我正在尝试更多地了解异常。我在我的 AppDelegate 中安装了一个未捕获的异常处理程序:

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

所以我不完全确定这是如何工作的。假设我访问一个数组越界,这会引发异常。为什么不调用此方法?或者说在从表中插入或删除行后抛出断言异常 - 在这些情况下,我如何在应用程序崩溃之前保存数据?

一般来说,当系统抛出异常时,我怎样才能有机会在应用程序崩溃之前保存数据?或者它不是那样工作的?未捕获的异常处理程序是否仅适用于我抛出的未包含在 @catch 或 @try 中的异常?

【问题讨论】:

  • 仅用于未捕获的异常。如果你在其他地方抓到它们,它们也不是没有被抓到的。此外,这个问题缺乏足够的信息。您需要提供一个无法按预期工作的特定代码示例。
  • @JodyHagins it 不像我预期的那样工作..整个事情。
  • 如果我在没有任何@try@catch 的情况下访问越界数组,则不会调用该方法。不应该吗?
  • 让我补充一点,盲目地保存在未捕获的异常处理程序中并不是一个好习惯。你不知道你为什么到达那里,你可能正在破坏你的数据存储。一般来说,您希望在此处尽可能少做可能会发生变异和数据的事情。
  • @JodyHagins 真的吗?知道我可以在哪里阅读更多相关信息吗?

标签: objective-c ios cocoa exception


【解决方案1】:

当你的方法被调用时,'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

【讨论】:

  • 这很奇怪..我做了你所做的并将该代码放在我的 applicationDidFinishLuanching 中,但它没有被调用
  • 我只是把它放在一个视图控制器中,但它仍然没有被调用。我正在做你正在做的事情。这是什么原因造成的?
  • 好吧,等等——在我在调试器中多次点击播放按钮后,日志语句终于出现了。所以我想它确实有效:)
  • 像我一样添加日志消息。在设置处理程序后立即在上面添加我的代码,看看它是否被调用。尝试创建一个全新的测试项目(就像我一样)并用它进行测试。如果它有效,那么您的项目中有一些设置会导致问题 - 我尝试打开和关闭“Objective-C Exceptions”,它在两种情况下都有效。
  • 那么在这一点上,使用上面的确切代码,有没有办法让应用程序免于崩溃?还是只有当我使用 try/catch 时?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多