Domanda

Sto cercando di trasferire le eccezioni arbitrarie da un server a un client XMLRPC (entrambi gli script Python, tipi di eccezione sono definiti su entrambi i lati). C'è un'implementazione lato client esemplare a ActiveState Ricette che analizza la tornata "faultString", confronta con un elenco di eccezioni noti e, se trovato, solleva tale eccezione (invece di avvolgerlo in un xmlrpclib.Fault).

Esempio di una risposta di eccezione 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 ricetta ActiveState divide il "ValueError:". Stringa e la confronta "ValueError" con ValueError.__name__ (che è in allowed_errors = [ValueError, TypeError], collegamento vedi sopra)

E 'possibile passare tutti eccezioni come questo, cioè sollevare automaticamente qualsiasi eccezione (derivato da Exception o qualche altra classe base) sul lato client (dopo che è stata sollevata sul server)?

Lo script funziona ActiveState, ma non voglio registrare ogni singola eccezione che potrebbero essere gettati (deve essere in allowed_errors).

(Domanda bonus:?? C'è un'altra tecnologia a parte XMLRPC in grado di gestire questo problema correttamente Pyro)

È stato utile?

Soluzione

Si potrebbe compilare l'elenco allowed_errors da __builtins__:

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

Ciò gestire il caso comune, per eccezioni built-in come ValueError, TypeError, OSError, ecc Si potrebbe probabilmente fare qualcosa di più avanzato simile PyYAML e salamoia, dove cacciano automaticamente qualsiasi riferimento eccezione viene inviato, ma questo apre te fino ad attacchi dannosi.

Se si desidera che il tipo di trasparenza client / server che sollevando automaticamente le eccezioni dal server sul client implica, Pyro probabilmente sarebbe una scelta migliore di XML-RPC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top