Frage

Ich versuche, beliebige Ausnahmen von einem XMLRPC-Server an einen Client zu übergeben (beide Python-Skripte, Ausnahmetypen sind auf beiden Seiten definiert).Eine beispielhafte clientseitige Implementierung finden Sie unter ActiveState-Rezepte die den zurückgegebenen „faultString“ analysiert, ihn mit einer Liste bekannter Ausnahmen vergleicht und, falls gefunden, diese Ausnahme auslöst (anstatt sie in eine zu verpacken xmlrpclib.Fault).

Beispiel einer XMLRPC-Ausnahmeantwort:

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

Das ActiveState-Rezept teilt die Zeichenfolge „ValueError:“ und vergleicht „ValueError“ mit ValueError.__name__ (welches ist in allowed_errors = [ValueError, TypeError], vgl.Link oben).

Ist ein Passieren möglich? alle Ausnahmen wie diese, d.h.löst automatisch jede Ausnahme aus (abgeleitet von Exception oder eine andere Basisklasse) auf der Clientseite (nachdem es auf dem Server ausgelöst wurde)?

Das ActiveState-Skript funktioniert, aber ich möchte nicht jede einzelne Ausnahme registrieren könnte geworfen werden (muss drin sein). allowed_errors).

(Bonus-Frage:Gibt es neben XMLRPC eine andere Technologie, die dieses Problem ordnungsgemäß lösen könnte?Pyro?)

War es hilfreich?

Lösung

Sie könnten die ausfüllen allowed_errors Liste von __builtins__:

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

Dies würde den allgemeinen Fall behandeln, für integrierte Ausnahmen wie ValueError, TypeError, OSError, usw.Sie könnten wahrscheinlich etwas Fortgeschritteneres wie PyYAML und Pickle verwenden, bei dem automatisch jede gesendete Ausnahme, auf die verwiesen wird, aufspürt wird. Dies macht Sie jedoch anfällig für böswillige Angriffe.

Wenn Sie die Art von Client/Server-Transparenz wünschen, die das automatische Auslösen von Ausnahmen vom Server auf dem Client impliziert, wäre Pyro wahrscheinlich die bessere Wahl als XML-RPC.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top