Search code examples
objective-cexceptionnsexception

NSException raise:format: as the last statement in a method


I have this method:

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

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

Compiler complains that:

Control may reach end of non-void function

It is just a warning, but it does not matter.

Obvious fix for that is to add for example return nil; after the [NSException raise: ....

However, I think it is not needed (and is even misleading for readers), because the exception is thrown, so it is not true that "Control may reach end of non-void function". Or am I missing something ...? Is it only compiler imperfection or there is some considerable reason for this?

The compiler is Apple LLVM compiler 3.1


Solution

  • The reason is simple.

    For the compiler, the method [NSException raise: ...] is a black box method. It doesn't know that the method will actually raise an exception.

    If you compare it with Java or C++, their throw statements are a language feature and the compiler knows exactly what will happen when it finds it. In Obj-C it's different and sometimes it depends on runtime conditions. Consider the following.

    NSException* exception = nil;
    
    if (someCondition) {
    
       exception = [NSException exceptionWithName:...];
    }
    
    [exception raise];
    

    The compiler won't know if the exception is really raised or not.