Вы должны определенно избегать исключений для таких вещей, как разбор чисел из строк. В Objective-C исключения представляют ошибку программиста, а не ошибку ввода пользователя или даже недоступные файлы. (Частично причина в том, что обработка исключений всегда более затратна и сложна, чем более «обычная» обработка ошибок. Независимо от того, что ввод блоков @try
равен «нулевой стоимости» в 64-битном , это все еще медленный всякий раз, когда возникает исключение.) Конечно, вы можете использовать исключения по своему усмотрению, но это не способ Какао, и вы окажетесь в противоречии с другим кодом Objective-C. Люди, которые используют ваш код, будут невероятно раздражены тем, что вы генерируете исключения в случаях, которые могут привести к ошибке.
Из Документы Apple :
"Во многих средах использование исключений является довольно распространенным явлением. Например, вы можете выдать исключение, чтобы указать, что подпрограмма не может выполняться нормально - например, когда файл отсутствует или данные не могут быть проанализированы правильно Исключения являются ресурсоемкими в Objective C. Вы не должны использовать исключения для общего управления потоком или просто для обозначения ошибок. Вместо этого вы должны использовать возвращаемое значение метода или функции, чтобы указать, что произошла ошибка, и предоставить информация о проблеме в объекте ошибки. "
Посмотрите, как встроенные классы Какао обрабатывают подобные ошибки. Например, NSString имеет такие методы, как -floatValue
, которые возвращают 0 в случае сбоя. Лучшим решением для вашей конкретной ситуации может быть то, как NSScanner делает это, например, -scanFloat:
- принимает указатель на поле, в котором должен быть сохранен результат, и возвращает YES
или NO
на основе о том, был ли анализ успешным.
Помимо соглашения и передового опыта Obejctive-C, NSError гораздо более надежен и гибок, чем NSException, и позволяет вызывающей стороне эффективно игнорировать проблему, если они этого хотят. Я предлагаю прочитать Руководство по программированию обработки ошибок для какао . Примечание: Если вы принимаете параметр NSError**
, я настоятельно рекомендую вам также разрешить клиенту передавать NULL
, если он не хочет получать какую-либо информацию об ошибке. Каждый известный мне класс Какао делает это из-за ошибок, включая NSString.
Хотя портированный код может в конечном итоге выглядеть совсем не так, как Java-код, следует понимать, что он будет использоваться кодом Objective C, а не теми же клиентами, что и Java-эквивалент. Определенно соответствует идиомы языка. Порт не будет зеркальным отображением кода Java, но в результате он будет намного более корректным (для Objective-C).