@ bbum ответ абсолютно правильный (и он знал бы ответ лучше, чем большинство). Чтобы уточнить немного ...
В Какао, как правило, следует избегать использования исключений (@try/@catch[/@finally]
) для управления потоком. Как вы упоминаете, исключения несут необычайно большую стоимость (по сравнению с такими временами выполнения, как JVM или CLR, оптимизированные для использования исключений). Кроме того, большинство платформ Cocoa не являются безопасными для исключений. Таким образом, создание исключения в коде инфраструктуры Какао опасно и может привести к странным, трудным для диагностики и катастрофическим (возможно, потеря данных) ошибкам в вашем приложении.
Вместо использования исключений, код Какао использует NSError
, чтобы сигнализировать об ошибках, которые восстанавливаются в приложении. Исключения используются для обозначения условий, после которых ваше приложение не может восстановиться. Таким образом, компонент UI, запрашивающий позицию «вне границ» в массиве модели, может сигнализироваться с ошибкой (представленной пользователю по причине, по которой его запрос не может быть выполнен) при попытке получить доступ к позиции «вне границ», учитывая Индекс, который, по вашему мнению, должен быть действительным, сигнализирует об исключительном состоянии, когда ваше приложение находится в несовместимом состоянии и, вероятно, должно умереть как можно скорее, прежде чем оно сможет нанести больше ущерба.
NSParameterAssert
, например, сигналы с NSException
, когда утверждение не выполняется.
Так когда следует использовать исключения или @try/@catch
? Если вы используете библиотеку C / C ++, которая использует исключения, вы должны перехватить эти исключения, прежде чем они могут быть возвращены через код Какао. Точно так же, если вы серьезно относитесь к непротиворечивости состояния в вашем приложении, вы должны вызвать исключение, как только обнаружите, что ваше состояние несовместимо (и неисправимо).