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

<p>в какао, когда я должен использовать nsassert, nsexception, nserror?</p><p>вот о чем я думал:</p><p><strong>nsassert</strong> - при создании какой-либо клиентской программы, используемой для программистов, для двойной проверки правил, соглашений, предположений или предварительных условий и постусловий?</p><p><strong>nsexception</strong> - при создании сторонней библиотеки для других программистов, использующих эту библиотеку, чтобы они сразу знали, когда ввод неверен?</p><p><strong>nserror</strong> - при взаимодействии с внешней системой для получения данных, таких как файл, база данных или веб-служба, которые не гарантируют результата?</p>

<p><strong>nsassert</strong> будет выдавать исключение, если оно завершится неудачей. так что nsassert - это короткий и простой способ написать и проверить все предположения, которые вы сделали в своем коде. на мой взгляд, это не альтернатива исключениям, а просто ярлык. если утверждение не выполняется, значит, в вашем коде что-то пошло не так, и программа не должна продолжаться.</p><p>стоит отметить, что nsassert не будет скомпилирован в ваш код при сборке релиза, поэтому он обычно используется для проверки работоспособности во время разработки. я на самом деле склонен использовать пользовательский макрос assert, который всегда активен.</p><p>время, когда вы <code>@throw</code> свой собственный <strong>nsexception</strong>, это когда вы определенно хотите это сделать в сборке релиза, и в таких вещах, как публичные библиотеки/интерфейс, когда некоторые аргументы недопустимы или вы были вызваны неправильно. обратите внимание, что на самом деле не принято <code>@catch</code> делать исключение и продолжать работу приложения. если вы попробуете это с некоторыми стандартными библиотеками apple (например, core data), могут произойти плохие вещи. подобно утверждению, если выдается исключение, приложение должно обычно завершаться довольно быстро, потому что это означает, что где-то есть ошибка программирования.</p><p><strong>nserrors</strong> следует использовать в ваших библиотеках/интерфейсах для ошибок, которые не являются ошибками программирования, и которые можно исправить. вы можете предоставить вызывающей стороне информацию/коды ошибок, и они могут аккуратно обработать ошибку, при необходимости предупредить пользователя и продолжить выполнение. это обычно относится к таким вещам, как ошибка "файл не найден" или другая нефатальная ошибка.</p>

<p>в какао существует соглашение, что исключение указывает на ошибку программиста. большая часть кода, включая фреймворк, не предназначена для правильной работы после возникновения исключения.</p><p>любая ошибка, которая должна быть исправлена, представлена <code>nserror</code>. существует также система представления <code>nserror</code>s пользователю. как вы говорите, это в основном полезно для ошибочных внешних ресурсов.</p><p>концептуально утверждение - это утверждение, которое данный предикат всегда оценивает как истинное; если это не так, программа не работает. хотя его поведение можно изменить, семейство <code>nsassert</code> по умолчанию является удобным способом выброса <code>nsinternalinconsistencyexception</code>s (с возможностью отключения их в сборках выпуска).</p>

<p>edit: в xcode 4.2, <a href="https://stackoverflow.com/questions/6445222/ns-block-assertions-in-objective-c">утверждения отключены по умолчанию для сборок выпуска</a> </p><p>теперь <strong> nsassert не будет скомпилирован в ваш код при сборке релиза </strong>, но вы можете изменить его в настройках сборки</p><hr><p>@ майк веллер, в твоем ответе один неверный ответ.</p><blockquote> <p>стоит отметить, что <strong> nsassert не будет скомпилирован в ваш код в сборке релиза </strong>, поэтому обычно используется для проверки работоспособности во время разработки.</p> </blockquote><p>на самом деле, <strong> nsassert будет скомпилирован в ваш код </strong>, если вы не добавите <code>ns\_block\_assertions</code> в свои прекомпилированные файлы префиксов.</p><p>в технической ноте tn2190 мы можем найти:</p><blockquote> <p>макросы, такие как ndebug для выключения c assert или ns\_block\_assertions для выключения nsassert foundation, важно указать для ваших предварительно скомпилированных файлов префиксов</p> </blockquote><p>или вы можете прочитать это: <a href="https://stackoverflow.com/a/8552636/1764735">как узнать, отключен ли nsassert в сборках релиза?</a> </p>

<p>в общем, исключения используются для сигнализации ошибок программиста - это вещи, которые не должны происходить. ошибки используются, чтобы сигнализировать об ошибках, которые могут возникнуть при нормальной работе программы, - в основном, об ошибках пользователя или внешних условиях, которые должны быть истинными, но не могут быть. поэтому попытка удалить какой-либо заблокированный элемент в документе может быть ошибкой, а попытка загрузить файл без подключения к интернету - ошибкой, но попытка доступа к недопустимому элементу в коллекции будет исключением.</p><p>утверждения обычно используются в тестировании, и afaik не используются в качестве общего механизма обработки ошибок, как другие.</p>