В блоке @[email protected]@finally, хорошо ли это использовать или продолжить нормально?
Это простой вопрос Objective-C.
При использовании @try
рабочий поток может выполняться двумя способами.
- Если появляется какое-то NSException, код сразу переходит в
@catch
и затем @finally
- Если нет, завершите выполнение
@try
и запустите @finally
Итак, какая разница в использовании или не использовании блока @finally
? Если я использую только:
-(void)function{
@try {
...
}
@catch (NSException *exception) {
...
}
>>>The workflow will run this line in any case?
}
Чем будет работать остальная часть функции или только блок @catch
, если создается NSException?
Ответы
Ответ 1
"Блок @finally содержит код, который должен быть выполнен независимо от того, выбрано ли исключение".
Происходит ли запуск кода после возврата в Objective-C?
Блок finally существует для выпуска/очистки ресурсов, таких как открытые сокеты, открытые файлы, блокировки базы данных, блокировки семафора и т.д.
Если в блоке catch произошла ошибка или блок catch блокирует исключение, то строка:
>>>The workflow will run this line in any case?
не выполняется. Однако код в блоке finally должен быть выполнен. Последний блок - последний, лучший шанс выйти из приложения, которое вот-вот произойдет сбой. Даже если приложение не собирается аварийно завершать работу, все же самое лучшее место для очистки ресурсов, потому что код внутри блока finally более вероятен для выполнения в непредвиденных условиях, чем код за пределами блока finally.
Ответ 2
Несколько замечаний:
- Блок @catch не требуется, вы можете попробовать @[email protected]наконец, и
используйте блок @finally для чего-либо (например, очистки), который должен произойти
даже если возникает исключение.
- Блок @catch не должен ловить
NSException, он может (и, вероятно, должен) быть изменен, чтобы поймать более конкретные
исключения. В этом случае блок @catch, а также код ниже
@[email protected]@, наконец, не будет запускаться в зависимости от исключения
Ответ 3
Несколько важных моментов, которые были пропущены в других ответах здесь.
- Apple не рекомендует использовать @try @catch @finally предложения в производственном коде. Их штраф слишком высок, и реальных преимуществ мало. В С++, где защитный код повсюду, вы можете проектировать свое приложение как "основанное на исключениях", то есть весь код предназначен для отката стека, а также для броска и повторного удаления исключений, пока они не достигнут верхнего уровня стека. Это не так в Obj-C, и даже в С++ эта парадигма убивает большинство оптимизаций компилятора, потому что компилятор не может использовать ярлык для любого сценария, поскольку исключение может сломать его в середине.
- Тем не менее --- Apple предоставляет механизм try/catch/finally в Obj-C, поэтому вы можете создать код только для конфигурации отладки, который поможет вам идентифицировать и уловить (буквально) ваши ошибки. ПЕРЕД доставкой приложения в общественности.
- Кроме того, Apple предоставляет полную (и красивую) парадигму и протокол "Обработка ошибок", поддерживаемую в API (объект NSError, вложенный протокол NSErrors NSError, API отображения NSError и т.д.), который подходит для обработки ошибок во время выполнения в вашем приложение - в "выпусках" сборок ваших приложений.
- Вышеприведенное корректно для обработки ошибок iOS и MacOS-X.
Итак, вся дискуссия об использовании @finally здесь немного преувеличена.