我还没有找到与我的经验一致的文档。
我想要的是一种在后台线程中处理未捕获异常的好方法。这种“方式”应该让应用程序崩溃,但在崩溃之前执行一些非常基本的操作(例如,将值保存到 UserDefaults 以便在下次启动时对其进行检查;加上日志记录)。
在主线程上,我只是设置了一个uncaughtExceptionHanlder并且工作正常。但是,在后台线程上 - 作为 NSOperationQueue 上的 NSOperation 执行 - 任何异常正在发生但未退出应用程序:Crashing。该应用程序继续在损坏的状态下运行。
但是,线程编程指南指出:
设置异常处理程序 如果您的应用程序捕获并处理异常,您的线程代码应该准备好捕获任何可能发生的异常。尽管最好在可能发生的地方处理异常,但未能在线程中捕获抛出的异常会导致您的应用程序退出。在你的线程入口例程中安装一个最终的 try/catch 允许你捕获任何未知的异常并提供一个适当的响应。
一种有效的方法(如下)是使用 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。