Каковы наилучшие методы обработки ошибок при написании API для iphone?
Мы пишем API для разработчиков iphone, и мы не знаем, что лучше всего подходит для обработки исключений. Мы рассмотрели NSError
, стандартный способ POSIX, NSException
Какое соглашение используется большинством API? Что является наиболее "дружественным" Objective-C?
Ответы
Ответ 1
Из Введение в темы программирования исключений:
Важно. Вы должны зарезервировать использование исключений для программирования или непредвиденных ошибок времени выполнения, таких как доступ к коллекции вне пределов, попытки мутации неизменяемых объектов, отправки недопустимого сообщения и потери соединения к серверу окон. Обычно вы заботитесь об этих типах ошибок с исключениями, когда приложение создается, а не во время выполнения.
...
Вместо исключений рекомендуется использовать объекты ошибок (NSError) и механизм доставки ошибок Cocoa, чтобы сообщить ожидаемые ошибки в приложениях Cocoa. Для получения дополнительной информации см. Руководство по программированию ошибок для Cocoa.
Итак, как я понимаю, используйте исключения только тогда, когда что-то смертельно неправильно. В противном случае используйте объекты NSError
.
Ответ 2
+1 для NSError
.
Я забываю, где в документах Apple я читал это, но я также вспоминаю, что они поощряют философию кодирования "сначала попробуйте, а затем проверьте на наличие ошибок", а не "проверьте на достоверность, а затем выполните операцию". Например, вместо того, чтобы видеть, доступна ли сеть перед ее использованием, просто попробуйте использовать ее и ответьте на ошибку, если/когда вы вернетесь назад.
Я согласен с этой философией для многих случаев использования, потому что (а) она перемещает проверку достоверности до момента действия, поэтому в некотором смысле она более точная и (б, субъективная) более увлекательно работать с кодом в этом шаблон.
Подводя итог, рекомендуем использовать NSError
и обеспечить немедленную обратную связь с параметрами NSError**
, которые принимают NULL
, чтобы быть очень дружелюбными к вашим пользователям API! Этот шаблон также устанавливается в нескольких местах в Cocoa/Touch; например, метод NSString
writeToFile:atomically:encoding:error:.