Python XMLRPC: обработка произвольных исключений на стороне клиента - PullRequest
1 голос
/ 12 января 2010

Я пытаюсь передать клиенту произвольные исключения с сервера XMLRPC (оба сценария Python, типы исключений определены с обеих сторон). В ActiveState Recipes имеется примерная реализация на стороне клиента, которая анализирует возвращенную "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, которая могла бы правильно решить эту проблему? Pyro?)

1 Ответ

2 голосов
/ 12 января 2010

Вы можете заполнить список allowed_errors из __builtins__:

[exc for exc in __builtins__ if isinstance(exc, BaseException)]

Это будет обрабатывать общий случай, для встроенных исключений, таких как ValueError, TypeError, OSError и т. Д. Вы могли бы сделать что-то более продвинутое, например PyYAML и pickle, где они автоматически выискивают любое упомянутое исключение отправляется, но это открывает себя для злонамеренных атак.

Если вам нужна такая прозрачность клиент / сервер, которая подразумевает автоматическое повышение исключений с сервера на клиенте, Pyro, вероятно, будет лучшим выбором, чем XML-RPC.

...