Pregunta

Estoy intentando pasar excepciones arbitrarias desde un servidor XMLRPC a un cliente (ambos scripts de Python, los tipos de excepción están definidos en ambos lados).Hay una implementación ejemplar del lado del cliente en Recetas de estado activo que analiza el "faultString" devuelto, lo compara con una lista de excepciones conocidas y, si se encuentra, genera esa excepción (en lugar de envolverla en un xmlrpclib.Fault).

Ejemplo de una respuesta de excepción 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>

La receta ActiveState divide la cadena "ValueError:" y compara "ValueError" con ValueError.__name__ (Qué esta en allowed_errors = [ValueError, TypeError], cf.enlace de arriba).

¿Es posible pasar? todo excepciones como esta, es decirgenerar automáticamente cualquier excepción (derivada de Exception o alguna otra clase base) en el lado del cliente (después de que se generó en el servidor)?

El script ActiveState funciona, pero no quiero registrar cada excepción que podría ser arrojado (debe estar en allowed_errors).

(Pregunta extra:¿Existe otra tecnología además de XMLRPC que pueda solucionar este problema correctamente?¿piro?)

¿Fue útil?

Solución

Podrías poblar el allowed_errors lista de __builtins__:

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

Esto manejaría el caso común, para excepciones integradas como ValueError, TypeError, OSError, etc.Probablemente podría hacer algo más avanzado como PyYAML y pickle, donde automáticamente buscan cualquier excepción a la que se envíe, pero esto se abre a ataques maliciosos.

Si desea el tipo de transparencia cliente/servidor que implica generar automáticamente excepciones desde el servidor en el cliente, Pyro probablemente sería una mejor opción que XML-RPC.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top