我回答了您关于这个主题的最后一个问题,并遇到了与Carbon的HIToolbox捕获IBActions抛出的异常相同的问题。
previous answer
NSSetUncaughtExceptionHandler()
生活(我相信)在链条的顶端。
-
添加
异常处理.framework
到Xcode项目
-
#import "ExceptionHandlerDelegate.h"
AppDelegate.m公司
:
// Very first message sent to class
+ (void)initialize
{
NSExceptionHandler *exceptionHandler = [NSExceptionHandler defaultExceptionHandler];
unsigned int handlingMask = NSLogAndHandleEveryExceptionMask;
[exceptionHandler setExceptionHandlingMask:handlingMask];
[exceptionHandler setDelegate:self];
// ...
}
#pragma mark -
#pragma mark NSExceptionHandler Delegate Methods
// Called 1st: Should NSExceptionHandler log the exception?
- (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldLogException:(NSException *)exception mask:(unsigned int)aMask
{
// ...log NSException if desired...
return NO; // Changes to YES if NSExceptionHandler should handle logging
}
// Called 2nd: Should NSExceptionHandler handle the exception?
- (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldHandleException:(NSException *)exception mask:(unsigned int)aMask
{
// ...crash your app here (e.g. [NSApp terminate:self]; )
// ...or handle the NSException and return YES/NO accordingly
return NO; // If app crashed, never gets returned - should crash before that
}
NSLogAndHandleEveryExceptionMask
flag告诉NSExceptionHandler捕获它所能捕获的每个异常(我相信仅适用于您的应用程序),而不管它在异常链的何处存在。
这意味着
@终于抓住/@试试/@了
积木不起作用,因为
NSHandleOtherExceptionMask
标志告诉NSExceptionHandler在异常处理程序链上捕获“它下面的所有内容”。您可以删除该标志,但是HIToolKit可能会再次获得任何IBAction异常,因为它似乎位于所述链的较低位置。
苹果的文档中有关于这些标志的信息:
NSExceptionHandler docs
因此,当引发NSException(应用程序AFAIK中的任意位置)并设置了NSLogAndHandleEveryExceptionMask时,代理中会按以下顺序调用这些异常:
-
-exceptionHandler:shouldLogException:mask:
被称为第一。
-
-exceptionHandler:shouldHandleException:mask:
被称为第二。
只要把“崩溃代码”放在第二个委托方法中,就可以了。
有用的文章:
Understanding Exceptions and Handlers in Cocoa
我认为让NSExceptionHandler的委托工作时遇到问题的原因是,它与设置为的自定义方法不兼容
NSSetUncaughtExceptionHandler()
,这是我上一个问题答案的一部分。每
Apple
:
NSExceptionHandler类提供
监测和监测设施
调试异常情况
Objective-C程序。它的工作原理是
异常处理程序通过
NSSetUncaughtExceptionHandler
功能。
因此,使用
NSExceptionHandler的服务,你
不得安装自己的自定义
未捕获的异常处理程序。
-reportException:
方法。
+initialize
与重写NSApplication的
-报告异常:
方法。