Ловля исключений, генерируемых из DLL - PullRequest
11 голосов
/ 09 ноября 2010

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

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

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

Ответы [ 2 ]

5 голосов
/ 09 ноября 2010

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

0 голосов
/ 09 ноября 2010

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

См. этот отчет об ошибке и попробуйте поискать "gcc"разделяемая библиотека исключений "(я до сих пор не нашел решения этой проблемы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...