任何原因 - [NSException raise]没有noreturn属性?

时间:2014-08-07 11:55:36

标签: objective-c clang nsexception

我正在编写一个自定义断言宏。它在断言失败时调用此函数。

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上的家人。但我无法找到相关的文档/指南。我错过了什么吗?

0 个答案:

没有答案