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

pep*_*psi 7 cocoa exception-handling exception objective-c

我一直用于XCode的一个有用提示是在异常上添加断点.

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

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

Tam*_*ese 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

调用时-throwAndCatch,断点 on-[NSException raise]不起作用,而断点 on 则objc_exception_throw起作用。