Исключение исключений из библиотек DLL

Когда исключение выходит из функции в DLL, среда выполнения mingw32 просто вызывает terminate std:: неожиданный, а не распространяет исключение на код, вызывающий DLL. Какие решения существуют для этой проблемы? DLL и приложение, вызывающее его, скомпилированы с тем же компилятором.

Существует два разных механизма исключения, поддерживаемые mingw32: SJLJ и Dwarf2. Должен ли кто-то из них работать лучше, чем другой? Возможно, единственный вариант - переключиться на MSVC или ICC или, возможно, изменить варианты сборки?

Обратите внимание, что даже catch (...) не поймает никаких исключений, даже не встроенных типов (throw 1;), поэтому речь идет не о видимости типа исключения.

Ответ 1

Является ли среда выполнения предположением, что функции extern "C" никогда не будут бросать исключения? Я не знаком с MinGW, но я знаю, что Visual Studio имеет множество аргументов командной строки для контроля такого поведения. Например, параметр /EHs заставит его предположить, что extern "C" никогда не будет бросать, и он будет обрабатывать функции, которые выбрасывают, вызывая std::unexpected(), который, в свою очередь, вызывает std::terminate(). Вы можете вызвать std::set_unexpected(), чтобы установить непредвиденный обработчик исключений и посмотреть, не ловутся ли он.

Ответ 2

Там швы возникают проблемы с gcc, сохраняя информацию о типе исключения, когда исключение выбрано из другой разделяемой библиотеки.

Смотрите этот отчет об ошибках и попробуйте googling для "gcc exception shared library" (я до сих пор не нашел решения этой проблемы)