Необработанный обработчик исключений не вызван - PullRequest
3 голосов
/ 21 марта 2012

Я пытаюсь перехватить исключения в моем приложении Mac, чтобы я мог записать их в специальный файл журнала. Я реализую обработчик исключений так:

void uncaughtExceptionHandler(NSException *exception) {
    NSLog(@"It Works!");
}

И я устанавливаю его в моем -applicationDidFinishLaunching: методе так:

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

Тогда я вызываю исключение, чтобы проверить это так:

[[NSArray arrayWithObject:@"object"] objectAtIndex:1];

Исключение регистрируется в консоли, но мой обработчик исключений не вызывается.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 22 марта 2012

Решение состоит в том, чтобы использовать ExceptionHandling framework. Вот как я это сделал:

В -applicationDidFinishLaunching:

[[NSExceptionHandler defaultExceptionHandler] setExceptionHandlingMask:NSLogAndHandleEveryExceptionMask];
[[NSExceptionHandler defaultExceptionHandler] setDelegate:self];

Затем в моем классе App Delegate я реализую два метода делегата,

- (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldLogException:(NSException *)exception mask:(NSUInteger)aMask
- (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldHandleException:(NSException *)exception mask:(NSUInteger)aMask

Теперь я могу поймать все исключения!

2 голосов
/ 21 марта 2012

AppKit имеет собственный высокоуровневый обработчик исключений в главном потоке, который сначала перехватывает исключение.Вы можете создать подкласс NSApplication и переопределить -reportException:, чтобы получить возможность что-то с ним сделать.

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

Ссылка: * 1007Сообщение Тима Вуда о macosx-dev в 1999 году .

...