objc_exception_throw和[NSException raise]有什么区别?

7

我一直在使用的一个有用技巧是在XCode中添加异常断点

我想知道为什么我们需要添加两个断点--一个是为了objc_exception_throw,另一个是为了[NSException raise]

它们各自覆盖哪些情况?

2个回答

4

您应该只在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 设置的断点有效。

0

以下是苹果文档关于异常的说明:

@throw 和 raise 之间的一个重要区别是,后者只能发送到 NSException 对象,而 @throw 可以将其他类型的对象作为其参数(例如字符串对象)。Cocoa 应用程序应该仅抛出 NSException 对象。

这意味着,如果您正在实现一个 Cocoa 应用程序项目 并严格遵循 @throw 仅抛出 NSExeption 对象的规则,它们是相同的。

参考文献:链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接