Spec-Zone.ru › GCC 15

9.7 Исключения

GNU Objective-C предоставляет встроенную в язык поддержку исключений, как показано в следующем примере:

@try {
  …
     @throw expr;
  …
}
@catch (AnObjCClass *exc) {
  …
    @throw expr;
  …
    @throw;
  …
}
@catch (AnotherClass *exc) {
  …
}
@catch (id allOthers) {
  …
}
@finally {
  …
    @throw expr;
  …
}

Оператор @throw может появляться в любом месте программы на Objective-C или Objective-C++; при использовании внутри блока @catch оператор @throw может не содержать аргумента (как показано выше), и в этом случае объект, перехваченный @catch, будет выброшен повторно.

Обратите внимание, что с помощью этой схемы можно выбрасывать и перехватывать только объекты Objective-C (указатели на них). Когда объект выбрасывается, он перехватывается ближайшим предложением @catch, способным обрабатывать объекты этого типа, аналогично тому, как работают блоки catch в C++ и Java. Предложение @catch(id …) (как показано выше) также может быть предоставлено для перехвата любых исключений Objective-C, не перехваченных предыдущими предложениями @catch (если таковые имеются).

Предложение @finally, если оно присутствует, будет выполнено при выходе из непосредственно предшествующего раздела @try … @catch. Это произойдет независимо от того, были ли какие-либо исключения выброшены, перехвачены или выброшены повторно внутри раздела @try … @catch, аналогично поведению предложения finally в Java.

Существует несколько нюансов при использовании нового механизма исключений:

  • При компиляции файлов Objective-C, использующих исключения, необходимо использовать опцию командной строки -fobjc-exceptions.
  • В среде выполнения GNU исключения всегда реализуются как «родные» (native) исключения, и при компоновке рекомендуется использовать опции -fexceptions и -shared-libgcc.
  • В среде выполнения NeXT, несмотря на то, что новый механизм разработан так, чтобы быть двоично совместимым с идиомами в стиле NS_HANDLER, предоставляемыми классом NSException, новые исключения могут использоваться только в Mac OS X 10.3 (Panther) и более поздних системах из-за дополнительной функциональности, требующейся в среде выполнения NeXT Objective-C.
  • Как упоминалось выше, новые исключения не поддерживают обработку типов, отличных от объектов Objective-C. Кроме того, при использовании из Objective-C++ модель исключений Objective-C в настоящее время не взаимодействует с исключениями C++. Это означает, что вы не можете @throw исключение из Objective-C и catch его в C++, или наоборот (т.е. throw … @catch).

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Exceptions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API