8.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 исключения всегда реализуются как «нативные» исключения, и рекомендуется использовать опции -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).
Далее: Синхронизация, Предыдущее: compatibility_alias, Вверх: Objective-C [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/Exceptions.html