Каковы наилучшие методы обработки ошибок при написании 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:.