Question

Je suis en train de transmettre des exceptions arbitraires d'un serveur XMLRPC à un client (les deux scripts Python, les types d'exception sont définies des deux côtés). Il y a un exemple d'implémentation côté client ActiveState Recettes qui analyse le retour « faultString », compare avec une liste d'exceptions connues et, si elle est trouvée, soulève cette exception (au lieu de l'emballage dans une xmlrpclib.Fault).

Exemple de réponse d'exception 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 recette Activestate divise le "ValueError:". Chaîne et compare "ValueError" avec ValueError.__name__ (qui est en allowed_errors = [ValueError, TypeError], link cf. ci-dessus)

Est-il possible de passer tous exceptions comme celle-ci, surélever automatiquement toute exception (dérivée de Exception ou d'une autre classe de base) sur le côté client (après avoir été élevé sur le serveur)?

Le script fonctionne ActiveState, mais je ne veux pas d'enregistrer chaque exception que pourrait être jetés (doit être en allowed_errors).

(Question bonus:? Y at-il une autre technologie à part XMLRPC capable de gérer correctement ce problème Pyro)

Était-ce utile?

La solution

Vous pouvez compléter la liste allowed_errors de __builtins__:

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

gérerait le cas commun, pour les exceptions intégrées comme ValueError, TypeError, OSError, etc. Vous pourriez probablement faire quelque chose de plus avancé comme PyYAML et conserves au vinaigre, où ils chassent automatiquement tout ce qui fait référence exception est envoyée, mais cela ouvre vous à des attaques malveillantes.

Si vous voulez que le type de transparence client / serveur qui automatiquement des exceptions soulevant du serveur sur le client implique, Pyro serait probablement un meilleur choix que XML-RPC.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top