我一直用于XCode的一个有用提示是adding breakpoints on exceptions。
我想知道为什么我们需要添加两个断点 - 一个用于objc_exception_throw
,另一个用于[NSException raise]
。
一个人覆盖的情况是另一个没有?
答案 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