Python XMLRPC:Обработка произвольных исключений на стороне клиента

StackOverflow https://stackoverflow.com/questions/2044904

  •  20-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь передать произвольные исключения с сервера 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top