这个问题是基于我的另一个问题 为什么我的应用程序没有被异常关闭。
问题
当通过一个 Action 在主线程抛出异常时,应用程序仍然不会崩溃。
根据Dave在我的原问题的回答,我实现了NSApplication上的reportException类别并设置了未捕获异常处理程序。
代码
我在我的应用程序委托中有以下代码,我已经将其连接到UI中的一个按钮进行测试。
-(IBAction)crashOnMainThread:(id)sender {
[self performSelectorOnMainThread:@selector(crash) withObject:nil waitUntilDone:YES];
}
-(void)crash {
// To test out the exception handling
[NSException raise:NSInternalInconsistencyException format:@"This should crash the app."];
}
当我按下按钮时,我的应用程序不会崩溃。当我查看控制台日志时,我看到了这个信息:
06/09/2010 14:12:25 EHTest1[26384] HIToolbox: ignoring exception 'This should crash the app.' that raised inside Carbon event dispatch
(
0 CoreFoundation 0x00007fff80ab4cc4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff819560f3 objc_exception_throw + 45
2 CoreFoundation 0x00007fff80ab4ae7 +[NSException raise:format:arguments:] + 103
3 CoreFoundation 0x00007fff80ab4a74 +[NSException raise:format:] + 148
4 EHTest1 0x00000001000010e3 -[EHTest1_AppDelegate crashLapsus] + 63
5 Foundation 0x00007fff88957c25 -[NSObject(NSThreadPerformAdditions) performSelector:onThread:withObject:waitUntilDone:modes:] + 234
6 Foundation 0x00007fff8896ad48 -[NSObject(NSThreadPerformAdditions) performSelectorOnMainThread:withObject:waitUntilDone:] + 143
7 EHTest1 0x0000000100001030 -[EHTest1_AppDelegate crashOnMainThread:] + 60
8 AppKit 0x00007fff85c7e152 -[NSApplication sendAction:to:from:] + 95
9 AppKit 0x00007fff85ca26be -[NSMenuItem _corePerformAction] + 365
** Snip **
看起来Carbon捕获了异常,这真的很烦人。
这表明对于任何操作代码,您需要立即在后台线程中运行它,以便任何异常都被注册为未捕获异常。嗯?我没有看到过任何结构化的代码。
我尝试过的
通过延迟使应用程序崩溃,以便它不连接到UI元素。它可以正常崩溃。
我尝试使用以下代码在我的应用程序委托中安装自定义NSExceptionHandler:
-(BOOL)exceptionHandler:(NSExceptionHandler *)sender
shouldHandleException:(NSException *)exception
mask:(unsigned int)aMask {
abort();
return YES;
}
-(void)applicationWillFinishLaunching:(NSNotification *)aNotification {
NSExceptionHandler *handler = [NSExceptionHandler defaultExceptionHandler];
[handler setExceptionHandlingMask:NSLogAndHandleEveryExceptionMask];
[handler setDelegate:self];
}
问题在于无论异常是否被捕获,它都会崩溃。如果我尝试检查掩码并且不在捕获异常时崩溃,则又回到了原点,因为看起来HIToolbox以与try / catch块完全相同的方式捕获异常。
问题: 1.如何停止HIToolbox捕获异常,使我的应用程序使用未捕获的异常处理程序并崩溃? 2.在与操作相同的调用堆栈中运行代码是否可以?这肯定没问题吧? 3.如果不行,那么有什么替代方案?
这让我非常烦恼,所以任何帮助将不胜感激。
[NSException raise]
和objc_exception_throw
上设置断点以调试您的异常,无需在此处崩溃。 - Sven[[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"NSApplicationCrashOnExceptions": @YES }];
,就能够正确地捕捉到崩溃错误。 - dmaclach