Исключение исключений из библиотек 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" (я до сих пор не нашел решения этой проблемы)