Нет никаких причин не использовать исключения, обычно в цели C, даже для обозначения исключений бизнес-правил. Apple может сказать, используйте NSError, кто заботится. Obj C существует уже давно, и когда-то ВСЯ документация C ++ говорила одно и то же. Причина, по которой не имеет значения, насколько дорого выбрасывать и перехватывать исключение, заключается в том, что время жизни исключения чрезвычайно мало и ... его ИСКЛЮЧЕНИЕ для обычного потока. Я никогда не слышал, чтобы кто-то говорил в моей жизни, что человеку, за исключением которого потребовалось много времени, чтобы его бросили и поймали.
Кроме того, есть люди, которые думают, что сама цель C слишком дорога, и вместо этого код на C или C ++. Поэтому, говоря, что всегда использовать NSError, плохо информирован и параноидален.
Но на вопрос этой темы еще не ответили, какой ЛУЧШИЙ способ вызвать исключение. Способы возврата NSError очевидны.
Так оно и есть: [повышение NSException: ... @throw [[выделение NSException] initWithName ....
или @throw [[MyCustomException ...?
Здесь я использую проверенное / непроверенное правило немного иначе, чем выше.
Реальное различие между (используя метафору java здесь) проверенным / непроверенным важно -> можно ли восстановиться после исключения. И под выздоровлением я подразумеваю не просто НЕ крушение.
Поэтому я использую пользовательские классы исключений с @throw для восстанавливаемых исключений, потому что
вероятно, у меня будет какой-то метод приложения, который ищет определенные типы сбоев в нескольких
@ поймать блоки. Например, если мое приложение - банкомат, у меня будет блок @catch для
"WithdrawalRequestExceedsBalanceException".
Я использую NSException: повышение для исключений времени выполнения, так как у меня нет способа восстановиться после исключения,
кроме как поймать его на более высоком уровне и записать его. И нет никакого смысла в создании собственного класса для этого.
В любом случае, это то, что я делаю, но, если есть лучший, с таким же выразительным способом, я бы тоже хотел узнать. В моем собственном коде, так как я давно перестал кодировать C hella, я никогда не возвращаю NSError, даже если я передал его через API.