4

我有这个方法:

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

    [NSException raise:@"Unknown format" format:@"Unknown format of parser"];
}

编译器抱怨:

Control may reach end of non-void function

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

明显的解决方法是return nil;[NSException raise: ....

但是,我认为它是不需要的(甚至会误导读者),因为抛出了异常,所以“控制可能到达非无效函数的结尾”是不正确的。还是我错过了什么……?仅仅是编译器的缺陷还是有一些相当大的原因?

编译器是 Apple LLVM 编译器 3.1

4

3 回答 3

11

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

于 2012-05-01T17:51:13.363 回答
8

原因很简单。

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

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

NSException* exception = nil;

if (someCondition) {

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

[exception raise];

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

于 2012-05-01T16:46:32.223 回答
1

警告之所以存在,是因为并非代码中的每条路径都以编译器认为可能有问题的 return 语句结尾。也就是说,您可能不应该在这里抛出异常,而应该生成一个NSError并返回nil. Objective-c 中异常和错误之间的区别在此处此处进行了解释。

于 2012-05-01T16:46:22.947 回答