【问题标题】:try catch around entire app尝试抓住整个应用程序
【发布时间】:2014-01-07 18:47:23
【问题描述】:

我想知道是否可以对整个应用程序进行尝试捕获?我的计划是这样做,然后在 UIAlertView 中显示任何错误,并使用“电子邮件开发人员”按钮预先填充给我的电子邮件。

虽然不是完美的用户体验,但总比应用崩溃要好。

【问题讨论】:

  • 并非如此。让它崩溃,你至少会得到一个堆栈跟踪。
  • 整个应用程序到底是什么意思?对于不同的代码,您必须将它放在不同的位置。
  • 我担心你不能,因为异常会在事件循环的某个地方被捕获。也就是说,不会有任何异常会离开main函数。
  • @CharlieSeligman 您需要一个在任何线程中捕获异常的解决方案。也就是说,此链接中的解决方案仅在异常在主线程上引发时才有效 - 并且如果它被传递到主函数(我认为不是这种情况,因为 iOS 在事件循环的早期捕获了所有异常。但是你可以快速测试一下)。
  • 嗯,好的。非常感谢。

标签: ios objective-c error-handling try-catch


【解决方案1】:

你可以做一些好事。 'NSSetUncaughtExceptionHandler'。

在你的 applicationDidFinishLaunchingWithOptions 添加:

NSSetUncaughtExceptionHandler(&HandleException);

当然还要在这个类中添加 c 函数:

void HandleException(NSException *exception)
{
        int32_t exceptionCount = OSAtomicIncrement32(&UncaughtExceptionCount);
if (exceptionCount > UncaughtExceptionMaximum)
{
    return;
}

NSArray *callStack = [UncaughtExceptionHandler backtrace];
NSMutableDictionary *userInfo =
    [NSMutableDictionary dictionaryWithDictionary:[exception userInfo]];
[userInfo
    setObject:callStack
    forKey:UncaughtExceptionHandlerAddressesKey];

[[[[UncaughtExceptionHandler alloc] init] autorelease]
    performSelectorOnMainThread:@selector(handleException:)
    withObject:
        [NSException
            exceptionWithName:[exception name]
            reason:[exception reason]
            userInfo:userInfo]
    waitUntilDone:YES];
}

添加handleException方法以随时显示错误。

编辑: 您甚至可以看到堆栈跟踪:参见 NSException 的“callStackSymbols”。

【讨论】:

  • 您(作为开发人员)如何查看堆栈跟踪?
  • 我其实不知道,但这不是查理要求的。他想显示错误并发送它。有总比没有好...
  • 你认为调用HandleException的那一刻主线程run loop会运行吗?我不确定 performSelectorOnMainThread 是否能正常工作。
  • @AviTsadok 我不同意。我认为使用此解决方案会导致“在野外”引发许多您完全不知道的异常,并且在用户报告它们的情况下,您没有足够的信息来修复错误。
  • 好! 1. 如果您不从二进制文件中删除符号,堆栈跟踪将只包含符号。 2. 在 iOS 上,大多数系统符号不会显示,而是显示 <redacted>(由于 iOS 内部优化)。 3. 不能使用 Xcode 符号化基础设施来符号化报表并查看行号。 4. 为什么不使用适当的崩溃报告解决方案,例如基于PLCrashReporter.org 的东西!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
相关资源
最近更新 更多