Разрешение имен межмодульных исключений через boost python не работает?

Вот моя проблема:

У меня есть два модуля 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 для открытия модулей расширения, чтобы авторам модулей расширения не нужно было знать, какие символы могут использовать другие модули расширения.". Я подозреваю, что это часть проблемы/решения, но я недостаточно знаю о разрешении символов, чтобы понять, как решить мою проблему.

Любые идеи?


person Kena    schedule 11.08.2010    source источник
comment
Просто для уточнения: вы говорите, что раскрытие B::someFunction() через Boost.Python каким-то образом меняет поведение B::someFunction(), так что он не может перехватывать исключения, созданные в A?   -  person Arlaharen    schedule 23.08.2010
comment
В яблочко. При воздействии на python B теряет информацию об исключениях библиотеки A.   -  person Kena    schedule 23.08.2010


Ответы (1)


Я нашел обходной путь к моей проблеме. На основании этого и текст ссылки, я понял, что добавление

import sys, dl
sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)

до того, как мои включения решат проблему, заставив python открывать библиотеки в немедленном глобальном режиме. Но я все еще надеюсь на альтернативное решение, если оно есть. Как упоминалось в первой ссылке, я подозреваю, что это может иметь непредвиденные последствия (я уже знаю, что конфликт имен может быть проблемой, и я подозреваю, что производительность также может быть затронута, но есть ли другие побочные эффекты?)

person Kena    schedule 23.08.2010