Возврат ошибок в target-c - PullRequest
       13

Возврат ошибок в target-c

10 голосов
/ 01 октября 2009

Я новичок в объективе-c и начинаю задумываться, каков общий / стандартный / правильный способ обработки и обнаружения ошибок?

Похоже, что для этого можно использовать NSError, это хорошая идея или угон какао?

1 Ответ

17 голосов
/ 01 октября 2009

Я почти уверен, что это то, что нужно сделать классу NSError - дать подробную информацию об ошибках. Наиболее распространенный шаблон, который вы увидите, - это метод, который получает указатель на объект NSError, например:

- (id)doSomethingWithArgument:(id)arg error:(NSError **)error

Метод возвращает некоторое значение (или, возможно, nil) для результата выполнения чего-либо, но если вызов не удался, объект NSError поместит указатель, переданный с деталями об ошибке. Ваша документация отвечает за указание того, что возвращается, если метод действительно обнаружил ошибку.

Другой метод, который приходит на ум, - это блок @throw - @catch; однако в Objective-C @throw исключение может быть довольно дорогим в вычислительном отношении, и обычно это рекомендуется делать только в действительно исключительных ситуациях.

Редактировать: Ух, оказывается, у многих действительно сильные мнения по поводу @throw исключений. Подводя итог (весьма полезный) комментарий по этому вопросу:

  • Создание исключений чаще всего связано с ошибкой программиста (ситуации, которые никогда не произойдут и т. П.); исключения не следует использовать для обычной обработки ошибок. Вместо этого используйте метод error, показанный выше, или отправьте экземпляры NSNotification.
  • Если вы все же широко используете блоки @throw / @catch, будьте очень осторожны с логикой, окружающей их. Objective-C предоставляет множество способов отсоединить методы для запуска в других потоках или отложить выполнение и т. Д. Будьте очень внимательны, чтобы учесть все эти возможности при написании кода.

Наконец, еще один очень верный пункт:

  • Если вы используете объект error, переданный методу, возвращаемое значение должно указывать его. Не пытайтесь сделать оба (возвратите частично действительный объект и установите объект error).
...