NSException raise:format:作为方法中的最后一个语句

Ond*_*rka 4 exception objective-c nsexception

我有这个方法:

+ (MHTwitterParser*)createParser:(NSString*)format {
    if ([format compare:@"json"] == NSOrderedSame) {
        return [[MHJsonTwitterParser alloc] init];
    }

    [NSException raise:@"Unknown format" format:@"Unknown format of parser"];
}
Run Code Online (Sandbox Code Playgroud)

编译抱怨:

Control may reach end of non-void function
Run Code Online (Sandbox Code Playgroud)

这只是一个警告,但没关系.

明显的解决方法是在例如return nil;之后添加[NSException raise: ....

但是,我认为它不是必需的(并且甚至会误导读者),因为异常被抛出,因此"控制可能达到非空函数的结束"并非如此.或者我错过了什么......?它只是编译器的不完善还是有一些相当大的原因呢?

编译器是Apple LLVM编译器3.1

Jef*_*mas 11

替换[exception raise];@throw exception;功能上是相同的,并将阻止警告(请参阅:抛出异常).


Sul*_*han 7

原因很简单.

对于编译器,该方法[NSException raise: ...]是黑盒方法.它不知道该方法实际上会引发异常.

如果将它与Java或C++进行比较,它们的throw语句是一种语言特性,编译器会确切地知道发现它时会发生什么.在Obj-C中它有所不同,有时它取决于运行时条件.考虑以下.

NSException* exception = nil;

if (someCondition) {

   exception = [NSException exceptionWithName:...];
}

[exception raise];
Run Code Online (Sandbox Code Playgroud)

编译器不知道是否真的引发了异常.