我一直在为 XCode 使用的一个有用技巧是在 exceptions 上添加断点。
我想知道为什么我们需要添加两个断点——一个 forobjc_exception_throw和一个 for [NSException raise]。
什么情况下一个覆盖,另一个不覆盖?
我一直在为 XCode 使用的一个有用技巧是在 exceptions 上添加断点。
我想知道为什么我们需要添加两个断点——一个 forobjc_exception_throw和一个 for [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,断点 on-[NSException raise]无效,而断点 onobjc_exception_throw将起作用。
以下是 Apple 文档中关于异常的内容:
@throw 和 raise 之间的一个重要区别是后者只能发送到 NSException 对象,而 @throw 可以将其他类型的对象作为其参数(例如字符串对象)。Cocoa 应用程序应该只@throw NSException 对象。
这意味着如果您正在实现 aCocoa applciation project并且如果您严格遵循 @throw 只有NSExeption对象,它们是相同的。
参考:链接