У меня есть тестовая программа под названием ftest. Он загружает .so файлы, которые содержат тесты, и запускает найденные там тесты. Один из этих тестов загружает и запускает .so, который содержит драйвер базы данных Postgres для нашего O / RM.
Когда драйвер Postgres генерирует исключение, которое определено в этом файле .so (или том, на которое он ссылается, но ftest не ссылается на него) и перехватывается тестовой средой, деструктор исключения вызывает ошибку сегмента.
Этот segfault происходит всякий раз, когда скомпилированное исключение находится в .so, который был динамически загружен (с использованием dload).
Подобные вещи отлично работают в Windows, которая имеет такую же архитектуру. На самом деле мы не хотим ограничивать себя использованием только исключений из базовых библиотек - надстройки должны иметь возможность создавать свои собственные классы исключений и обрабатывать их нормально.
Исключениями являются подклассы std :: exception. Иногда исключения могут быть определены в библиотеках (например, libpqxx), что означает, что исключения также иногда находятся вне нашего контроля.
Исключения создаются с использованием чего-то вроде:
throw exception_class( exception_arguments );
И ловятся с помощью:
catch ( std::exception &e ) {
// handler code
}
Нужна ли какая-то специальная опция компилятора, чтобы это работало? Нужно ли нам переключаться, чтобы выдавать исключения через throw new exception_class( args )
(мы не хотим этого делать)?