Я не нашел документации, согласующейся с моим опытом.
Мне нужен хороший способ обработки Uncaught-Exceptions в фоновом потоке. Этот «способ» должен допускать сбой приложения, но выполнять некоторые очень простые операции перед сбоем (например, сохранять значение в UserDefaults, чтобы его можно было проверить при следующем запуске; плюс ведение журнала).
В основном потоке я только что установил uncaughtExceptionHanlder, и все работает нормально. Однако в фоновом потоке, выполняемом как NSOperation в NSOperationQueue, возникает любое исключение, но не выход из приложения: сбой. Приложение продолжает работать в поврежденном состоянии.
Однако в Руководстве по программированию потоков говорится:
Настройка обработчика исключений Если ваше приложение перехватывает и обрабатывает исключения, код вашего потока должен быть готов к перехвату любых исключений, которые могут возникнуть. Хотя лучше всего обрабатывать исключения в том месте, где они могут возникнуть, неспособность перехватить выброшенное исключение в потоке приведет к завершению работы приложения. Установка финальной команды 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.