我一直在使用的一个有用技巧是在XCode中添加异常断点。
我想知道为什么我们需要添加两个断点--一个是为了objc_exception_throw
,另一个是为了[NSException raise]
。
它们各自覆盖哪些情况?
我一直在使用的一个有用技巧是在XCode中添加异常断点。
我想知道为什么我们需要添加两个断点--一个是为了objc_exception_throw
,另一个是为了[NSException raise]
。
它们各自覆盖哪些情况?
您应该只在objc_exception_throw
上使用断点。方法-[NSException raise]
调用objc_exception_throw
,因此objc_exception_throw
覆盖了-[NSException raise]
所覆盖的所有情况。反过来则不成立: @throw
指令被编译成直接调用objc_exception_throw
。这个方法展示了区别:
- (void)throwAndCatch
{
@try {
NSException *exception = [[NSException alloc] initWithName:@"Test"
reason:@"test"
userInfo:nil];
@throw exception;
}
@catch (NSException *exception) {
NSLog(@"Caught");
}
}
-throwAndCatch
时,对 -[NSException raise]
设置的断点无效,而对 objc_exception_throw
设置的断点有效。以下是苹果文档关于异常的说明:
@throw 和 raise 之间的一个重要区别是,后者只能发送到 NSException 对象,而 @throw 可以将其他类型的对象作为其参数(例如字符串对象)。Cocoa 应用程序应该仅抛出 NSException 对象。
这意味着,如果您正在实现一个 Cocoa 应用程序项目
并严格遵循 @throw 仅抛出 NSExeption
对象的规则,它们是相同的。
参考文献:链接