Не в настоящее время. Это будет доступно в CSS 3 , но это займет время, пока это не будет реализовано в большинстве браузеров.
Похоже, вы задаете здесь два вопроса: как установить обработчик исключений верхнего уровня; и как решить проблему определения первопричины.
Поймать исключение можно несколькими способами, но для этого лучшим подходом, по-видимому, будет установка обработчика исключений с помощью NSSetUncaughtExceptionHandler.
Когда в вашем приложении возникает исключение, оно обрабатывается обработчиком исключений по умолчанию. Этот обработчик не делает ничего, кроме записи сообщения в консоль перед закрытием приложения. Вы можете обойти это, установив собственный обработчик исключений, используя указанную выше функцию. Лучше всего для этого использовать делегат приложения applicationDidFinishLaunching: method.
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
NSSetUncaughtExceptionHandler(&myExceptionHandler);
}
После того, как вы установили собственный обработчик, вы: Я хочу расширить выходные данные по умолчанию, чтобы помочь вам определить причину.
void myExceptionHandler(NSException *exception)
{
NSArray *stack = [exception callStackReturnAddresses];
NSLog(@"Stack trace: %@", stack);
}
К сожалению, по сравнению с OSX, iPhone выглядит весьма ограниченным в отношении создания хорошей трассировки стека. Приведенный выше код создаст на первый взгляд ненужный вывод; однако вы можете запустить этот вывод с помощью инструмента atos, и вы сможете сгенерировать из него полезную трассировку стека.
Другой вариант - следовать инструкциям в этой статье , которые помогут создать хорошая автоматическая трассировка стека.
Поскольку это идет к бета-тестерам, вам, возможно, придется повозиться, чтобы заставить его работать на вас.
Вы говорите, что не смогли воспроизвести проблему самостоятельно, только ваш пользователей. В этом случае вам может быть полезно следующее техническое примечание от Apple:
https://developer.apple.com/library/content/technotes/tn2151/_index. html
ОБНОВЛЕНИЕ : хотя этот пост все еще содержит полезную информацию, некоторые из содержащихся в нем ссылок необратимо мертвы. Рекомендуется использовать информацию из этого альтернативного сообщения.
В XCode вы всегда должны устанавливать глобальную точку останова для objc_exception_throw
. Затем вы (обычно) получаете гораздо более значимую трассировку стека относительно того, что на самом деле пытается вызвать исключение.
Вы все равно можете получить исключения, которые происходят в коде таймера или других местах без вашего собственного кода где-либо в трассировке, но если вы посмотрите на цепочку методов, и вы обычно можете понять, в чем заключается исключение (например, отправив уведомление, когда цель исчезла).