В блоке @[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 здесь немного преувеличена.