我正在尝试在我的Mac应用上捕获异常,以便我可以将它们记录在自定义日志文件中。我正在实现这样的异常处理程序:
void uncaughtExceptionHandler(NSException *exception) {
NSLog(@"It Works!");
}
我正在我的-applicationDidFinishLaunching:
方法中设置它:
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
然后我引发一个异常来测试它:
[[NSArray arrayWithObject:@"object"] objectAtIndex:1];
异常会记录到控制台,但我的异常处理程序没有被调用。
有什么想法吗?
答案 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:
,以便有机会使用它。
但是,您的异常处理程序仍可能在其他线程上被调用。