7.11 Исключение Java
Язык Java использует немного другую модель обработки исключений, чем C++. Обычно GNU C++ автоматически обнаруживает, когда вы пишете код C++, использующий исключения Java, и обрабатывает их должным образом. Однако, если коду C++ нужно только выполнить деструкторы при возникновении исключений Java через него, GCC делает неверное предположение. Пример проблемного кода:
struct S { ~S(); };
extern void bar(); // is written in Java, and may throw exceptions
void foo()
{
S s;
bar();
}
Обычным результатом неверного предположения является ошибка линковки, с жалобой о недостающей функции, называемой ‘__gxx_personality_v0’.
Вы можете сообщить компилятору, что исключения Java должны использоваться в единице трансляции, независимо от того, что он может думать, написав ‘#pragma GCC java_exceptions’ в начале файла. Этот ‘#pragma’ должен появиться до любых функций, которые выбрасывают или ловят исключения, или выполняют деструкторы при возникновении исключений через них.
Вы не можете смешивать исключения Java и C++ в одной единице трансляции. Считается безопасным выбрасывать исключение C++ из одного файла через другой файл, скомпилированный для модели исключений Java, или наоборот, но могут быть ошибки в этой области.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/Java-Exceptions.html