Пользовательское исключение / ошибка NSException и NSError

Я недавно начал изучать Objective-C, и я работаю над приложением iOS в качестве упражнения, в любом случае я хочу справиться с переполнением, выбрасывая исключение (я исхожу из фона Java), я искал ссылку, где есть только NSException, но затем Я прочитал в разделе, в котором обсуждаются темы об обработке исключений, и они сказали использовать NSError, я прочитал ссылку, но у них был тот же протокол и методы, так в чем разница между ними? А что лучше?

Кроме того, я хочу создать собственное исключение или класс ошибки, есть ли какие-либо методы или поля, которые я должен включить? (Как при реализации интерфейса Exception в Java). Спасибо


person hakuna matata    schedule 19.06.2012    source источник


Ответы (1)


NSError предназначен для нефатальных исправимых ошибок. Проблемы, которые предназначены для захвата NSError, часто являются ошибками пользователя (или являются ошибками, которые могут быть представлены пользователю), которые часто можно исправить (отсюда _ 3_ и _ 4_) и обычно являются ожидаемыми или предсказуемыми ошибками (например, попытка открыть файл, к которому у вас нет доступа, или попытка преобразования между несовместимыми кодировками строк).

NSException разработан для потенциально фатальных ошибок программиста. Эти ошибки предназначены для обозначения потенциальных недостатков в вашем приложении, когда вы неправильно проверили предварительные условия для выполнения некоторых операций (например, попытки доступа к индексу массива, выходящего за его границы, или попытки изменить неизменяемый объект). Введение в Руководство по программированию исключений объясняет это немного.

person 一二三    schedule 19.06.2012
comment
Ох, хорошо. Итак, для обработки переполнения я должен использовать Exception, поскольку это недостаток в моем приложении? - person hakuna matata; 19.06.2012
comment
Да, если это непредвиденная ситуация, которая не должна возникать с правильным кодом. - person 一二三; 19.06.2012
comment
Ох, спасибо, а как насчет второй части вопроса, создания моего собственного класса Exception? - person hakuna matata; 19.06.2012
comment
Подклассы NSException встречаются редко: исключения обычно различаются по имени (с использованием +exceptionWithName:reason:userInfo:), а не по классу. Однако вы можете @raise любой тип объекта в качестве исключения (NSString, NSObject, что угодно), особых требований к интерфейсу нет (хотя это не рекомендуется). - person 一二三; 20.06.2012
comment
Ага, понятно. Большое спасибо: D - person hakuna matata; 20.06.2012
comment
Итак, в этом отношении NSError == исключение с проверкой java, NSException == исключение без проверки Java (RuntimeException) - person nbransby; 13.11.2012
comment
Нет. Objective-C не имеет проверенных исключений, и NSError не запускает обработчики исключений. - person 一二三; 14.11.2012
comment
Больше похоже на NSError == java unchecked Exception, NSException == java Error - person awiebe; 16.12.2012