Почему это исключение не перехватывается в DLL? - PullRequest
4 голосов
/ 02 декабря 2011

У меня есть DLL, которая выдает исключение следующим образом:

throw POMException(err, drvErr, errmsg);

Код вызова находится в отдельной программе и имеет блок try, catch следующим образом:

try
{
    // function in separate DLL
}
catch (TXNPDO_Exception& e)
{
    SR_PERFLOG_MSG(SR_PERFMASK_SELECT, "ERROR selectInStages");
    TXNDBO_THROW(e);
}

Где TXNPDO_Exception определено во включенном файле:

#define TXNPDO_Exception POMException

При запуске этого в отладчике говорится, что POMException не обработан. Я даже добавил предложение catch(...), но оно до сих пор не обработано.

Я подозреваю, что это как-то связано с параметрами компиляции Visual C ++, поскольку рассматриваемая библиотека DLL является устаревшей библиотекой, которая компилируется отдельно от вызывающей ее программы. Я использую Visual Studio 2003.

Файлы DLL cpp компилируются со следующими (соответствующими) флагами: /X /GR /Ob1 /Zi /GX /Od /MDd /LD. Другие исключения в вызывающей программе обрабатываются правильно.

Кто-нибудь может указать причины, по которым это исключение не распространяется на вызывающую программу?

Edit:

Библиотека DLL была ранее скомпилирована с возможной средой сборки и изменениями кода, которые мне недоступны. Ранее скомпилированная библиотека правильно распространяет исключения.

Я компилирую клиентскую программу, используя тот же компилятор, используя в основном те же ключи: -Od -W3 -Z7 -MDd -GX -GR -Zm800 (без /X или /Ob1 и /Z7 вместо /Zi).

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Я бы предположил, что выбрасывание исключений через границы .dll возможно только тогда, когда различные .dll и исполняемый файл программы скомпилированы для одной и той же среды выполнения C ++, таким образом, разделяя одну и ту же кучу. Я могу ошибаться, но это мое лучшее предположение.

Edit:

Полагаю, я не был не прав .

1 голос
/ 02 декабря 2011

Я наконец-то выяснил, в чем проблема, и в данном конкретном случае это не имеет никакого отношения к выбрасыванию исключений между DLL.

Проблема возникает из-за того, что обработчик исключений устанавливается далее в стек вызовов. Я диагностировал это, добавляя блоки try, catch (...) на каждый уровень в библиотеке, пока не нашел точку, в которой исключение не распространялось. Когда я закомментировал код регистрации обработчика исключений, исключение было успешно распространено.

Теперь мне нужно выяснить, как работают обработчики исключений, что выходит за рамки этого вопроса. Спасибо всем, кто поделился своими ответами.

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