Как Вы реализуете глобальный iPhone Exception Handling?

Не в настоящее время. Это будет доступно в CSS 3 , но это займет время, пока это не будет реализовано в большинстве браузеров.

59
задан MarqueIV 12 February 2012 в 09:46
поделиться

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

ОБНОВЛЕНИЕ : хотя этот пост все еще содержит полезную информацию, некоторые из содержащихся в нем ссылок необратимо мертвы. Рекомендуется использовать информацию из этого альтернативного сообщения.

80
ответ дан 24 November 2019 в 18:24
поделиться

Вы пробовали NSSetUncaughtExceptionHandler ?

2
ответ дан 24 November 2019 в 18:24
поделиться

В XCode вы всегда должны устанавливать глобальную точку останова для objc_exception_throw . Затем вы (обычно) получаете гораздо более значимую трассировку стека относительно того, что на самом деле пытается вызвать исключение.

Вы все равно можете получить исключения, которые происходят в коде таймера или других местах без вашего собственного кода где-либо в трассировке, но если вы посмотрите на цепочку методов, и вы обычно можете понять, в чем заключается исключение (например, отправив уведомление, когда цель исчезла).

5
ответ дан 24 November 2019 в 18:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: