бросить исключение в цель-с / какао - PullRequest
407 голосов
/ 27 ноября 2008

Какой лучший способ создать исключение в объективе-c / какао?

Ответы [ 13 ]

520 голосов
/ 27 ноября 2008

Я использую [NSException raise:format:] следующим образом:

[NSException raise:@"Invalid foo value" format:@"foo of %d is invalid", foo];
255 голосов
/ 28 ноября 2008

Слово предостережения здесь. В Objective-C, в отличие от многих похожих языков, вы, как правило, должны стараться избегать использования исключений для общих ошибок, которые могут возникнуть при нормальной работе.

Документация Apple для Obj-C 2.0 гласит следующее: «Важно: Исключения являются ресурсоемкими в Objective-C. Вы не должны использовать исключения для общего управления потоком или просто для обозначения ошибок ( например, файл недоступен) "

Концептуальная документация Apple по обработке исключений объясняет то же самое, но несколькими словами: «Важно: вам следует зарезервировать использование исключений для программирования или непредвиденных ошибок времени выполнения, таких как доступ к коллекции за пределами допустимого, попытки чтобы изменить неизменяемые объекты, отправив недопустимое сообщение и потеряв соединение с оконным сервером. Обычно такие ошибки устраняются за исключением случаев, когда создается приложение, а не во время выполнения. [.....] Вместо исключения, объекты ошибок (NSError) и механизм доставки ошибок Какао являются рекомендуемым способом сообщения об ожидаемых ошибках в приложениях Какао. "

Причины этого частично связаны с программированием идиом в Objective-C (с использованием возвращаемых значений в простых случаях и ссылочных параметров (часто класса NSError) в более сложных случаях), частично из-за того, что выбрасывание и перехват исключений - это гораздо более дорогой и, наконец, (и, что наиболее важно) исключение Objective-C - это тонкая оболочка для функций setjmp () и longjmp () в C, что существенно портит вашу осторожную обработку памяти, см. это объяснение .

60 голосов
/ 27 ноября 2008
@throw([NSException exceptionWith…])
33 голосов
/ 08 июля 2009

У меня нет представителя, чтобы комментировать ответ eJames, поэтому я думаю, что мне нужно поставить свой здесь. Для тех, кто пришел из Java-фона, вы помните, что Java различает Exception и RuntimeException. Исключение является проверенным исключением, а RuntimeException не проверяется. В частности, Java предлагает использовать проверенные исключения для «нормальных условий ошибки» и непроверенные исключения для «ошибок времени выполнения, вызванных ошибкой программиста». Кажется, что исключения Objective-C следует использовать в тех же местах, где вы использовали бы непроверенное исключение, а значения возврата кода ошибки или значения NSError предпочтительнее в тех местах, где вы будете использовать проверенное исключение.

15 голосов
/ 28 ноября 2008

Я считаю, что лучше использовать @throw с вашим собственным классом, который расширяет NSException. Затем вы используете те же обозначения для try catch, наконец:

@try {
.....
}
@catch{
...
}
@finally{
...
}

Apple объясняет здесь, как создавать и обрабатывать исключения: Ловля исключений Бросая исключения

14 голосов
/ 07 ноября 2009

Начиная с ObjC 2.0, исключения Objective-C больше не являются оболочкой для setjmp () longjmp () C и совместимы с исключением C ++, @try является "бесплатным", но создание и отлов исключений - это гораздо больше. дорого.

В любом случае, утверждения (используя семейство макросов NSAssert и NSCAssert) генерируют исключение NSException, и это разумно для использования их в качестве состояний Райса.

8 голосов
/ 12 мая 2014

Вот как я узнал об этом из «Руководства по ранчо большого ботаника (4-е издание)»:

@throw [NSException exceptionWithName:@"Something is not right exception"
                               reason:@"Can't perform this operation because of this or that"
                             userInfo:nil];
8 голосов
/ 19 апреля 2012

Используйте NSError для сообщения об ошибках, а не об исключениях.

Краткие сведения о NSError:

  • NSError позволяет кодам ошибок в стиле C (целым числам) четко определять основную причину и, надеюсь, позволяет обработчику ошибок устранить ошибку. Вы можете легко обернуть коды ошибок из библиотек C, таких как SQLite, в экземпляры NSError.

  • NSError также имеет то преимущество, что является объектом, и предлагает способ более подробного описания ошибки с помощью своего словарного элемента userInfo.

  • Но, что самое приятное, NSError НЕ МОЖЕТ быть выброшен, поэтому он поощряет более упреждающий подход к обработке ошибок, в отличие от других языков, которые просто подбрасывают «горячий картофель» дальше и дальше вверх по стеку вызовов, и в этот момент он может только быть сообщенным пользователю и не обрабатываться каким-либо осмысленным образом (если вы не верите в то, что следуете самому большому принципу сокрытия информации ООП).

Ссылка Ссылка: Ссылка

6 голосов
/ 23 января 2013

Вы можете использовать два метода для вызова исключения в блоке try catch

@throw[NSException exceptionWithName];

или второй метод

NSException e;
[e raise];
3 голосов
/ 22 июля 2009

Я считаю, что вы никогда не должны использовать исключения для управления нормальным ходом программы. Но исключения должны создаваться всякий раз, когда какое-либо значение не соответствует желаемому значению.

Например, если какая-то функция принимает значение, и это значение никогда не может быть равно нулю, тогда лучше создать исключение, а не пытаться сделать что-то «умное» ...

Риз

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...