Цель-C: утверждение против исключения против ошибки - PullRequest
79 голосов
/ 16 февраля 2011

В Какао, когда я должен использовать NSAssert, NSException, NSError?

Вот о чем я думал:

NSAssert - При создании любой клиентской программы, используемой в интересах программистов для двойной проверки правил, соглашений, предположений или предварительных условий и постусловий?

NSException - При создании сторонней библиотеки для других программистов, которые используют библиотеку, чтобы они сразу знали, когда ввод неверен?

NSError - При взаимодействии с внешней системой для получения данных, таких как файл, база данных или веб-служба, которые не гарантируют получение результата?

Ответы [ 4 ]

99 голосов
/ 16 февраля 2011

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

Следует отметить, что NSAssert не будет скомпилирован в ваш код при сборке выпуска, поэтому обычно используетсядля проверки работоспособности во время разработки.Я на самом деле склонен использовать пользовательский макрос assert, который всегда активен.

Когда вы @throw свой собственный NSException бывали, когда вы определенно захотите его в сборке релиза и в других вещахнапример, публичные библиотеки / интерфейс, когда некоторые аргументы недействительны или вы были вызваны неправильно.Обратите внимание, что на самом деле не принято @catch исключение и продолжать запускать ваше приложение.Если вы попробуете это с некоторыми стандартными библиотеками Apple (например, Core Data), могут произойти плохие вещи.По аналогии с утверждением, если выдается исключение, приложение должно обычно завершаться довольно быстро, потому что это означает, что где-то есть ошибка программирования.

NSErrors следует использовать в ваших библиотеках / интерфейсах для ошибоккоторые не являются ошибками программирования, и которые могут быть восстановлены из.Вы можете предоставить вызывающей стороне информацию / коды ошибок, и они могут аккуратно обработать ошибку, при необходимости предупредить пользователя и продолжить выполнение.Обычно это относится к таким вещам, как ошибка «Файл не найден» или другая нефатальная ошибка.

3 голосов
/ 16 февраля 2011

В Какао существует соглашение, согласно которому исключение указывает на ошибку программиста. Большая часть кода, включая код инфраструктуры, не предназначена для правильной работы после возникновения исключения.

Любая ошибка, которая должна быть исправлена, представлена ​​NSError. Также есть система для представления NSError s пользователю. Как вы говорите, это в основном полезно для ошибочных внешних ресурсов.

Концептуально утверждение - это утверждение, которое данный предикат всегда оценивает как истинное; если это не так, программа не работает. Хотя его поведение может быть изменено, семейство NSAssert по умолчанию является удобным способом выброса NSInternalInconsistencyException s (с возможностью отключить их в выпусках сборки).

2 голосов
/ 04 сентября 2014

Edit: В Xcode 4.2 утверждения отключены по умолчанию для сборок выпуска,

Теперь NSAssert не будет скомпилирован в ваш код при сборке выпуска , но вы можете изменить его в настройках сборки


@ Майк Веллер, в твоем ответе есть одна ошибка.

Следует отметить, что NSAssert не будет скомпилирован в ваш код в сборке выпуска , поэтому обычно используется для проверки работоспособности во время разработки.

На самом деле, NSAssert будет скомпилирован в ваш код , если вы не добавите NS_BLOCK_ASSERTIONS в свои прекомпилированные файлы префиксов.

В Техническом примечании TN2190 мы можем найти:

Макросы, такие как NDEBUG для выключения C assert или NS_BLOCK_ASSERTIONS для выключения NSAssert Foundation, важны для указания ваших предварительно скомпилированных файлов префиксов

Или вы можете прочитать это: Как узнать, отключен ли NSAssert в сборках релиза?

1 голос
/ 16 февраля 2011

В общем, исключения используются для сигнализации ошибок программиста - это вещи, которые не должны происходить.Ошибки используются, чтобы сигнализировать об ошибках, которые могут возникнуть при нормальной работе программы, - в основном, об ошибках пользователя или внешних условиях, которые должны быть истинными, но не могут быть.Поэтому попытка удалить какой-либо заблокированный элемент в документе может быть ошибкой, а попытка загрузить файл без подключения к Интернету - ошибкой, но попытка доступа к недопустимому элементу в коллекции будет исключением.

Утверждения обычно используются при тестировании, а AFAIK не используются в качестве общего механизма обработки ошибок, как другие.

...