Я использую MySQL C ++ соединитель с этим (немного упрощенным) кодом.
try
{
statement->setString(1, word);
statement->executeUpdate();
}
catch( sql::SQLException& e )
{
// I don't get here
return sqlerrno_to_error_code( e.getErrorCode() );
}
catch( std::exception& e )
{
// I do get here and the cast works
sql::SQLException& sqle = (sql::SQLException&) e;
return sqlerrno_to_error_code( sqle.getErrorCode() );
}
Предполагается, что соединитель генерирует исключение sql :: SQLException, которое происходит от std :: exception и имеет несколько дополнительных методов, таких как getErrorCode()
,
Исключение выдается во втором catch
блок, но можно привести к (и использовать как)sql::SQLException
успешно.
Еще более странно, что похожий код в другом исполняемом файле ловит sql::SQLException
как и ожидалось. Разница между ними заключается в том, что первый находится в общем объекте (.so), который загружен dlopen()
,
RHEL 5.7 32 бит, gcc 4.1.2
Смотрите примечание для dynamic_cast
, throw
, typeid
не работать с общими библиотеками на странице часто задаваемых вопросов GCC.
Потому что вы используете dlopen()
необходимо связать свой исполняемый файл с -E
флаг (или пропуск-Wl,-E
в g++
если g++
вызывает компоновщик) и передать RTLD_GLOBAL
флаг для dlopen()
,
Других решений пока нет …