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.
Существует несколько нюансов при использовании новой механизма исключений:
- Флаг командной строки
-fobjc-exceptionsдолжен использоваться при компиляции файлов Objective-C, использующих исключения. - В GNU runtime исключения всегда реализуются как «родные» исключения, и рекомендуется использовать флаги
-fexceptionsи-shared-libgccпри линковке. - В NeXT runtime, хотя он в настоящее время разработан для двоичной совместимости с
NS_HANDLER-стилевыми идиомами, предоставляемыми классомNSException, новые исключения могут использоваться только на системах Mac OS X 10.3 (Panther) и более поздних, из-за дополнительных функциональных возможностей, необходимых в NeXT Objective-C runtime. - Как упоминалось выше, новые исключения не поддерживают обработку типов, отличных от объектов 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-4.9.4/gcc/Exceptions.html