未调用异常处理程序

时间:2012-03-21 02:41:03

标签: objective-c macos cocoa exception-handling foundation

我正在尝试在我的Mac应用上捕获异常,以便我可以将它们记录在自定义日志文件中。我正在实现这样的异常处理程序:

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

我正在我的-applicationDidFinishLaunching:方法中设置它:

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

然后我引发一个异常来测试它:

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

异常会记录到控制台,但我的异常处理程序没有被调用。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

解决方案是使用ExceptionHandling框架。我是这样做的:

-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

现在我可以捕捉所有异常!

答案 1 :(得分:2)

AppKit在主线程上有自己的高级异常处理程序,它首先捕获异常。您可以继承NSApplication并覆盖-reportException:,以便有机会使用它。

但是,您的异常处理程序仍可能在其他线程上被调用。

参考:Tim Wood's message on macosx-dev back in 1999