Повышение NSException: format: как последнее утверждение в методе

У меня есть этот метод:

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

    [NSException raise:@"Unknown format" format:@"Unknown format of parser"];
}
</code>

Компилятор жалуется, что:

<code>Control may reach end of non-void function
</code>

Это всего лишь предупреждение, но это не имеет значения.

Очевидное решение для этого, например, добавитьreturn nil; после[NSException raise: ....

Тем не менее, я думаю, что это не нужно (и даже вводит в заблуждение читателей), потому что выдается исключение, поэтому неверно, что "Control может достигнуть конца не пустой функции". Или я что-то упустил ...? Это только несовершенство компилятора или есть какая-то существенная причина для этого?

Компилятор Apple LLVM 3.1

 Paul.s01 мая 2012 г., 18:41
Это всего лишь метод объекта, если бы я хотел, чтобы я мог быстро изменить метод, чтобы он не выдавал исключение, и тогда моя программа достигла бы конца не пустой функции ... Я уверен, что есть и другие более полезные причины.
 Ondrej Peterka01 мая 2012 г., 18:46
@ Paul.s Спасибо, Пол. Это имеет смысл, и это верный момент. Мне любопытно, если кто-нибудь придумает какое-то другое объяснение.

Ответы на вопрос(3)

[exception raise]; с@throw exception; функционально одно и то же и предотвратит предупреждение (см .:Бросать исключения).

что не каждый путь в коде заканчивается оператором возврата, который компилятор признает потенциально проблемным. Тем не менее, вы, вероятно, не должны генерировать здесь исключение, а должны генерироватьNSError и возвращаясьnil, Различия между исключениями и ошибками в target-c объясняютсяВот а такжеВот.

 27 сент. 2013 г., 13:47
верно, это не имеет ничего общего сNSException и это предупреждение возникло бы, даже если в качестве последнего высказывания было какое-либо другое (невозвратное) утверждение.
Решение Вопроса

Для компилятора метод[NSException raise: ...] метод черного ящика Он не знает, что метод фактически вызовет исключение.

Если вы сравните это с Java или C ++, ихthrow операторы - это особенность языка, и компилятор точно знает, что произойдет, когда он его найдет. В Obj-C он отличается и иногда зависит от условий выполнения. Учтите следующее.

NSException* exception = nil;

if (someCondition) {

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

[exception raise];

Компилятор не будет знать, действительно ли возникло исключение или нет.

 Ondrej Peterka01 мая 2012 г., 18:49
Спасибо за объяснение.
 27 сент. 2013 г., 13:49
Объяснение действительно хорошее, но это не точный ответ. Предупреждение не потому, что компилятор не распознаетNSException но он может видеть невозвратный оператор в последней строке сразу после условия (которое может быть выполнено или не выполнено)
 27 сент. 2013 г., 14:32
@Sulthan, спасибо, мужик, мне нужно больше в этом разобраться. Но я столкнулся с этим предупреждением даже безNSException сценарий
 27 сент. 2013 г., 14:03
@geekay Это не правда. Если вы замените последний оператор чем-то, что компилятор понимает, например,abort() или жеassert(false)Вы не получите предупреждение. Проблема здесь в том, что компилятор не знает, что повышениеNSException прервет поток программы.

Ваш ответ на вопрос