我没有找到与我的经验一致的文档。
我想要一个处理后台线程中未捕获异常的好方法。这个“方法”应该让应用程序崩溃,但在崩溃之前执行一些非常基本的操作(例如将值保存到UserDefaults中,以便在下次启动时检查;还有记录日志)。
在主线程上,我只需设置一个uncaughtExceptionHanlder,这很好用。然而,在作为NSOperationQueue上的NSOperation执行的后台线程上,任何异常都会发生 但不会退出应用程序:崩溃。应用程序继续在已损坏的状态下运行。
但是,线程编程指南指出:
设置异常处理程序 如果应用程序捕获和处理异常,则线程代码应准备捕获可能发生的任何异常。尽管最好在可能发生异常的地方处理异常,但在线程中无法捕获抛出的异常会导致应用程序退出。 在您的线程入口例程中安装最终的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。
int fd = open(UTF8StringOfDocumentsDirectoryPlusFileNameSavedAtAppStartup, O_WRONLY | O_CREAT | O_TRUNC); if (fd != -1) { write(fd, "crashed", sizeof("crashed") - 1); close(fd); }
- Gwynne Raskind