Обработка исключений в iOS - PullRequest
7 голосов
/ 22 июля 2011

Читая документацию и просматривая примеры кодов Apple (и большинство стороннего кода Objective-C, доступного там), у меня складывается впечатление, что вы не должны выполнять обработку исключений, используя try / catch и «традиционный»./ C ".
Недавно я читал Amazons AWS iOS SDK и заметил, что они свободно использовали старый метод.
Это было для меня облегчением, потому что я всегда чувствовал, что должен убедиться, что поймал исключениеособенно когда я использую код, написанный кем-то еще, или двоичные библиотеки (я имею в виду такие вещи, как двоичные файлы Google Analytics).У меня вопрос, есть ли причина избегать "традиционного" обработки исключений "на iOS, или это просто не изящная практика Objective-C сделать это?

Ответы [ 2 ]

11 голосов
/ 22 июля 2011

Есть все основания избегать исключений в iOS.

Исключения в iOS явно зарезервированы для катастрофического сбоя, который невозможно восстановить.Они не предназначены для использования в операциях типа «перехват и восстановление».

Внимание! Вам следует зарезервировать использование исключений для программирования или непредвиденных ошибок во время выполнения, таких как выход из строя.ограничивает доступ к коллекции, пытается изменить неизменяемые объекты, отправляет недопустимое сообщение и теряет соединение с оконным сервером.Обычно вы устраняете ошибки такого рода за исключением случаев, когда создается приложение, а не во время выполнения.

Если у вас есть существующий объем кода (например, сторонняя библиотека), который использует исключения для обработки ошибокусловия, вы можете использовать код как есть в вашем приложении Какао.Но вы должны убедиться, что любые ожидаемые исключения во время выполнения не выходят из этих подсистем и не попадают в код вызывающего.Например, библиотека синтаксического анализа может использовать внутренние исключения для указания проблем и обеспечения быстрого выхода из состояния синтаксического анализа, которое может быть глубоко рекурсивным;однако вам следует позаботиться о том, чтобы перехватывать такие исключения на верхнем уровне библиотеки и переводить их в соответствующий код возврата или состояние.

Это приводит к двум проблемам (среди прочих):

  • вы не можете @ выбросить исключение через фрейм кода системной платформы.Поведение не определено.

  • Если вы разработаете свой код для использования исключений, у вас будет существенное несоответствие импеданса на границе между вашим кодом и системой.Это будет не только неудобно, но и усложнит все будущие операции по обслуживанию и рефакторингу по мере того, как эта граница смещается.Это также усложнит интеграцию с системой.

Обратите внимание, что если AWS SDK генерирует исключения через стековый фрейм, принадлежащий системным фреймворкам, он делает это неправильно.

2 голосов
/ 29 августа 2013

Bbum находится на месте. Похоже, что AWS iOS SDK движется к подходу на основе NSError для будущих выпусков. На данный момент они предоставляют механизм для остановки исключений и работы с ошибками NSEr.

#import <AWSiOSSDK/AmazonErrorHandler.h>   
// put this in didFinishLaunching  
[AmazonErrorHandler shouldNotThrowExceptions];

подробнее здесь:
https://mobile.awsblog.com/post/Tx2PZV371MJJHUG/How-Not-to-Throw-Exceptions-with-the-AWS-SDK-for-iOS

...