iOS : Background Thread Exceptions Not Crashing

标签 ios multithreading exception exception-handling abort

我没有找到符合我经验的文档。

我想要的是一种在后台线程中处理未捕获异常的好方法。这种“方式”应该让应用程序崩溃,但在崩溃之前执行一些非常基本的操作(例如,将值保存到 UserDefaults 以便下次启动时可以检查它;加上日志记录)。

在主线程上,我刚刚设置了一个 uncaughtExceptionHanlder 并且工作正常。但是,在后台线程上 - 作为 NSOperationQueue 上的 NSOperation 执行 - 发生任何异常但不退出应用程序:崩溃。该应用程序继续在损坏的状态下运行。

但是,线程编程指南指出:

Setting Up an Exception Handler If your application catches and handles exceptions, your thread code should be prepared to catch any exceptions that might occur. Although it is best to handle exceptions at the point where they might occur, failure to catch a thrown exception in a thread causes your application to exit. Installing a final try/catch in your thread entry routine allows you to catch any unknown exceptions and provide an appropriate response.

一种有效的方法(如下)是将线程调用方法嵌入到 try/catch 中,并在出现异常时记录日志,然后调用 abort()。但这不是最好的方法。我想将异常发送到主线程并让未捕获的异常处理程序处理它。 有人做过吗?

- (void)threadMethod
{
    @try
    {
        NSArray* aTest = [NSArray array];
        [aTest objectAtIndex:10];
    }
    @catch (NSException* e)
    {
        // Save to state to User Defaults.
        // Log any needed info.

        abort();
    }
    @finally
    {

    }
}

仅供引用:我在 iOS6 上运行,使用 XCode 4.5 SDK。

最佳答案

  1. NSOperationQueue 运行的线程由 libdispatch 管理,它捕获异常并调用 terminate,退出应用程序。如果您看到不同的行为,那么您就已经做错了。
  2. 在异常发生后将数据保存到 NSUserDefaults 是一个不确定的提议;因为 Cocoa 只将异常视为程序员错误,一旦抛出异常,它不会尝试让自己处于可用状态。简而言之,您应该像对待“真正的”崩溃一样对待它,就好像只有异步信号安全的 API 可用一样。在这方面,任何 Objective-C 都会自动退出。
  3. 您的问题表明您正在尝试进行崩溃报告。为此,我会推荐一个崩溃报告解决方案,例如 PLCrashReporter .还有许多嵌入崩溃报告的分析和分发服务,包括 HockeyApp , Crashlytics , TestFlight , 和 QuincyKit .还有其他的,哪一个适合你取决于你的需要。所有这些都将处理涉及安全处理崩溃和异常并保存数据以供日后使用的所有棘手问题,而您无需担心任何这些问题。

关于iOS : Background Thread Exceptions Not Crashing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14298628/

相关文章:

java - 在 Javadoc 中使用多少 @throws

javascript - 如何使用 bokeh 库(Python + JavaScript)管理错误并将其显示在用户界面上?

c++ - std::is_nothrow_destructible 的奇怪行为

ios - Admob iOS : Getting com. google.DummyAdapter 在真实设备上,在模拟器上工作

带有 watchkit 目标 : `The executable was signed with invalid entitlements` error for distribution profile 的 iOS 应用

c++ - 我想重新运行一个线程

java - 你如何检查哪个线程正在执行 Java 中的代码?

ios - CoreML : "Unexpected error processing model" error sometimes occurring

ios - 如何在一个 UITableView 中制作多个列表? iOS swift

java - Java BlockingQueue 中的 put(s) 和 take(s)