【发布时间】:2012-06-17 18:43:51
【问题描述】:
我一直在为 XCode 使用的一个有用提示是 adding breakpoints on exceptions。
我想知道为什么我们需要添加两个断点——一个用于objc_exception_throw,一个用于[NSException raise]。
一种涵盖哪些情况而另一种不涵盖?
【问题讨论】:
标签: objective-c cocoa exception exception-handling
我一直在为 XCode 使用的一个有用提示是 adding breakpoints on exceptions。
我想知道为什么我们需要添加两个断点——一个用于objc_exception_throw,一个用于[NSException raise]。
一种涵盖哪些情况而另一种不涵盖?
【问题讨论】:
标签: objective-c cocoa exception exception-handling
以下是 Apple 文档中关于异常的内容:
@throw 和 raise 之间的一个重要区别是后者 只能发送到 NSException 对象,而 @throw 可以 其他类型的对象作为其参数(例如字符串对象)。可可 应用程序应该只@throw NSException 对象。
这意味着如果您正在实现 Cocoa applciation project 并且如果您严格遵循 @throw 只有 NSExeption 对象,它们是相同的。
参考:Link
【讨论】:
您应该只在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 上的断点将起作用。
【讨论】: