2012-03-21 3 views
3

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

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

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

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 

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

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

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

Любые идеи?

ответ

4

Решение состоит в использовании рамки ExceptionHandling. Вот как я это сделал:

В -applicationDidFinishLaunching:

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

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

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

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

2

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

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

Справка: Tim Wood's message on macosx-dev back in 1999.

+0

Я пробовал это, и я до сих пор не поймаю исключения. '-reportException:' никогда не вызывается. Если исключение было вызвано в '-applicationDidFinishLaunching:', не следует ли его вызывать? Разве это не работает на основной теме? – edc1591

+0

Да, '-applicationDidFinishLaunching:' вызывается в основном потоке. Вы уверены, что ваш подкласс NSApplication? Вам нужно указать его имя класса в вашем «Info.plist» под ключом «NSPrincipalClass». –

+0

Да, я уверен. '[NSApp class];' возвращает мой подкласс. – edc1591

Смежные вопросы