我正在尝试在我的 iPhone 应用程序中使用 NSAssert
,这样如果出现意外情况,应用程序会快速失败并崩溃并在崩溃日志中显示一条有意义的消息。
如果失败的 NSAssert
在主线程上,这可以正常工作,因为它默认引发 NSInternalInconsistencyException
未被捕获并停止执行。但我也在后台线程中进行处理,在这种情况下 NSAssert
只是中止线程,但程序继续运行。
我目前的解决方案是在主线程中捕获并重新抛出异常(在这种情况下,NSOperation
的main
方法):
- (void)main {
@try {
int x = 14;
...
NSAssert1(x > 20, @"x should be greater than 20, was %d", x);
...
}
@catch (NSException *e) {
[e performSelectorOnMainThread:@selector(raise) withObject:nil waitUntilDone:YES];
}
}
有没有更好的方法?也许使用自定义 NSAssertionHandler?
我知道我可以将 C 的 assert
与静态注释一起使用:
assert(x > 20 && "x should be greater than 20");
但这不允许我显示 x
的实际失败值是多少。
最佳答案
您可以将 NSAssert
替换为测试代码,然后引发异常。这样,如果断言失败,将抛出异常,由 @catch
block 捕获并在主线程上重新引发。
注意:您甚至可以定义一个 C 宏,以提供紧凑的形式。
关于iphone - NSAssert 在线程中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2015788/