Pergunta

Eu estou tentando passar arbitrário exceções a partir de um servidor XMLRPC para um cliente (tanto de scripts Python, tipos de exceção são definidas em ambos os lados).Há um exemplar implementação do lado do cliente no ActiveState Receitas que analisa o retornado "faultString", compara ele com uma lista de exceções e, se encontrado, levanta a exceção (em vez de envolvê-lo em um xmlrpclib.Fault).

Exemplo de um XMLRPC resposta de exceção:

<?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>

O ActiveState receita divide o "ValueError:" cadeia de caracteres e compara "ValueError" com ValueError.__name__ (o que está em allowed_errors = [ValueError, TypeError], cf.link acima).

É possível passar todos exceções como essa, i.é.aumentar automaticamente qualquer exceção (derivado de Exception ou alguma outra classe base) no lado do cliente (depois que ele foi criado no servidor)?

O ActiveState script funciona, mas eu não quero registrar qualquer exceção que poderia ser lançada (deve ser em allowed_errors).

(Pergunta bônus:Existe outra tecnologia além de XMLRPC que poderia lidar com este problema de forma adequada?Pyro?)

Foi útil?

Solução

Você pode preencher o allowed_errors lista de __builtins__:

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

Isso iria lidar com o caso comum, built-in de exceções como ValueError, TypeError, OSError, etc.Você provavelmente poderia fazer algo mais avançado como PyYAML e picles, onde eles automaticamente caçar qualquer que seja referenciado exceção é enviada, mas isso abre-se a ataques mal-intencionados.

Se você deseja que o tipo de cliente/servidor de transparência que, automaticamente, gerar exceções do servidor no cliente implica, Pyro provavelmente seria uma escolha melhor do que o XML-RPC.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top