перехват исключения в загруженной общей библиотеке

#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. Вероятно, реализация исключения не должна находиться в загруженной библиотеке. Таким образом, приведенный пример должен работать (исключение стандартной библиотеки), но не в том случае, если генерируется подкласс исключения, определенный в загруженной библиотеке.