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

时间:2012-06-14 17:11:25

标签: objective-c cocoa exception exception-handling

我一直用于XCode的一个有用提示是adding breakpoints on exceptions

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

一个人覆盖的情况是另一个没有?

2 个答案:

答案 0 :(得分: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上的断点将起作用。

答案 1 :(得分:0)

以下是Apple关于例外的文档:

  

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

这意味着如果您正在实施Cocoa applciation project,并且如果您严格遵循@throw仅NSExeption个对象,则它们是相同的。

参考:Link