#c #shared-libraries
#c #разделяемые библиотеки
Вопрос:
Переносится ли перехват исключения, выданного в загруженной общей библиотеке? Я заметил, что это работает с dlfcn.h
, но мне интересно, ожидается ли такое поведение вообще, например, при использовании LoadLibrary
вместо этого в Windows?
Пример кода:
main.cpp:
#include <stdexcept>
#include <cstdio>
#include <dlfcn.h>
typedef void(*dummy_t)();
int main()
{
dummy_t f;
void* handle;
handle = dlopen("module.so", RTLD_LAZY);
f = (dummy_t)dlsym(handle, "modulemain");
try
{
f();
}
catch(std::runtime_erroramp; e)
{
fprintf(stderr, "caught exception: %sn", e.what());
}
dlclose(handle);
}
module.cpp:
#include <stdexcept>
extern "C" void modulemain()
{
throw std::runtime_error("some terrible error occured");
}
Ответ №1:
Да, это должно нормально работать под Windows.
Комментарии:
1. Вероятно, реализация исключения не должна находиться в загруженной библиотеке. Таким образом, приведенный пример должен работать (исключение стандартной библиотеки), но не в том случае, если генерируется подкласс исключения, определенный в загруженной библиотеке.