我正在编写一个自定义断言宏。它在断言失败时调用此函数。
void _XLCAssertionFailedCritical(NSString *format, ...) __attribute__((noreturn));
void _XLCAssertionFailedCritical(NSString *format, ...)
{
va_list ap;
va_start(ap, format);
NSException *ex = [NSException exceptionWithName:NSInternalInconsistencyException reason:[[NSString alloc] initWithFormat:format arguments:ap] userInfo:nil];
va_end(ap);
[ex raise];
}
但它有警告
XLCAssertion.m:69:1:声明的功能' noreturn'不应该返回
将[ex raise]
更改为@throw ex
修正了警告。
但如果-[NSException raise]
具有noreturn
属性,警告就不会存在。事实上,NSException
中的所有方法都没有noreturn
属性。
我了解如果ex为[ex raise]
,nil
仍可能会返回。在这种情况下,根本不允许在实例方法上使用noreturn
属性。但是[NSException raise:format:]
总是会引发一个异常(除非有人调整它...)所以应该使用noreturn
来帮助编译器分析无法访问的代码并且检查方法不会返回。
这只是让我觉得永远不应该使用raise
及其NSException
上的家人。但我无法找到相关的文档/指南。我错过了什么吗?