Вот моя проблема:
У меня есть два модуля C++, A и B, которые построены как динамически подключаемые библиотеки. A предлагает основные математические функции и настраиваемые типы исключений. B — это модуль более высокого уровня, который использует A.
B::someFunction() вызывает функцию из A и пытается перехватить пользовательское исключение A:MyExceptionFromA, чтобы преобразовать его в пользовательский тип B:MyExceptionFromB (поскольку пользователям модуля B не нужно знать подробности реализации A ).
Все работает нормально, пока я остаюсь в домене C++. Однако, если я выставляю B::someFunction() в python через boost python, исключение больше не перехватывается в модуле C++.
Я могу поймать std::runtime_error, из которого происходит A:MyExceptionFromA, и вызвать typeid(e).name(), чтобы получить правильное искаженное имя, поэтому я знаю, что выброшено правильное исключение. Поэтому я подозреваю, что проблема возникает из-за преобразования этого искаженного символа в правильный тип исключения.
Я нашел эту ссылку, которая объясняет, что "python использует [островной] model для открытия модулей расширения, чтобы авторам модулей расширения не нужно было знать, какие символы могут использовать другие модули расширения.". Я подозреваю, что это часть проблемы/решения, но я недостаточно знаю о разрешении символов, чтобы понять, как решить мою проблему.
Любые идеи?