it-swarm-ru.tech

Цель-C: утверждение против исключения против ошибки

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

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

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

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

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

79
Tobias

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

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

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

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

99
Mike Weller

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

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

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

3
Jens Ayton

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

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


@ Майк Веллер, в твоем ответе один неверный ответ.

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

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

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

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

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

2
likid1412

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

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

1
Chuck