Python XMLRPC:Обработка произвольных исключений на стороне клиента
Вопрос
Я пытаюсь передать произвольные исключения с сервера XMLRPC клиенту (оба сценария Python, типы исключений определены с обеих сторон).Пример реализации на стороне клиента представлен на сайте Рецепты ActiveState который анализирует возвращенную «faultString», сравнивает ее со списком известных исключений и, если обнаруживает, вызывает это исключение (вместо того, чтобы заключать его в xmlrpclib.Fault
).
Пример ответа об исключении XMLRPC:
<?xml version='1.0'?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value>
<int>1</int>
</value>
</member>
<member>
<name>faultString</name>
<value>
<string>ValueError:</string>
</value>
</member>
</struct>
</value>
</fault>
</methodResponse>
Рецепт ActiveState разбивает строку «ValueError:» и сравнивает «ValueError» с ValueError.__name__
(который в allowed_errors = [ValueError, TypeError]
, ср.ссылку выше).
Можно ли пройти все подобные исключения, т.е.автоматически вызывать любое исключение (полученное из Exception
или какой-то другой базовый класс) на стороне клиента (после того, как он был поднят на сервере)?
Сценарий ActiveState работает, но я не хочу регистрировать каждое исключение, которое мог быть брошенным (должен находиться в allowed_errors
).
(Бонусный вопрос:Есть ли другая технология, помимо XMLRPC, которая могла бы правильно решить эту проблему?Пиро?)
Решение
Вы можете заполнить allowed_errors
список из __builtins__
:
[exc for exc in __builtins__ if isinstance(exc, BaseException)]
Это будет обрабатывать общий случай для встроенных исключений, таких как ValueError
, TypeError
, OSError
, и т. д.Вероятно, вы могли бы сделать что-то более продвинутое, например PyYAML и Pickle, где они автоматически отслеживают любое отправляемое исключение, на которое ссылаются, но это открывает возможности для вредоносных атак.
Если вам нужна такая прозрачность клиент/сервер, которая предполагает автоматическое создание исключений с сервера на клиенте, Pyro, вероятно, будет лучшим выбором, чем XML-RPC.