2010-01-18 7 views
13

J'ai essayé de contrôler une caméra via un fichier wsdl en utilisant SUDS. J'ai le code qui fonctionne, mais je veux placer la gestion des erreurs dans le script. J'ai essayé différentes exceptions, mais je n'arrive pas à faire fonctionner le script. Lorsque j'entre une coordonnée invalide, j'obtiens une erreur. Le code que j'utilise est ci-dessous suivi de l'erreur que je reçois.Traitement des erreurs en Python avec SUDS

#!/home/build/Python-2.6.4/python 

import suds 
from suds.client import Client 

#################################################################### 
# 
# Python SUDS Script that controls movement of Camera 
# 
#################################################################### 
# 
#     Absolute Move Function 
# 
#################################################################### 

def absoluteMove(): 

    # connects to WSDL file and stores location in variable 'client' 
    client = Client('http://file.wsdl') 

    # Create 'token' object to pass as an argument using the 'factory' namespace 
    token = client.factory.create('ns4:ReferenceToken') 
    print token 

    # Create 'dest' object to pass as an argument and values passed to this object 
    dest = client.factory.create('ns4:PTZVector') 
    dest.PanTilt._x=400 
    dest.PanTilt._y=0 
    dest.Zoom._x=1 
    print dest 

    # Create 'speed' object to pass as an argument and values passed to this object 
    speed = client.factory.create('ns4:PTZSpeed') 
    speed.PanTilt._x=0 
    speed.PanTilt._y=0 
    speed.Zoom._x=1 
    print speed 

    # 'AbsoluteMove' method invoked passing in the new values entered in the above objects 

    try: 
     result = client.service.AbsoluteMove(token, dest, speed) 
    except RuntimeError as detail: 
     print 'Handling run-time error:', detail 

    print "absoluteMove result ", result 

result = absoluteMove() 

L'erreur est ci-dessous:

No handlers could be found for logger "suds.client" 
Traceback (most recent call last): 
    File "ptztest.py", line 48, in <module> 
    if __name__ == '__main__': result = absoluteMove()  
    File "ptztest.py", line 42, in absoluteMove 
    result = client.service.AbsoluteMove(token, dest, speed) 
    File "build/bdist.linux-i686/egg/suds/client.py", line 537, in __call__ 
    File "build/bdist.linux-i686/egg/suds/client.py", line 597, in invoke 
    File "build/bdist.linux-i686/egg/suds/client.py", line 632, in send 
    File "build/bdist.linux-i686/egg/suds/client.py", line 683, in failed 
    File "build/bdist.linux-i686/egg/suds/bindings/binding.py", line 235, in get_fault 
suds.WebFault: Server raised fault: 'Error setting requested pan' 

Je ne sais pas quelle exception que je devrais utiliser ici. Est-ce que quelqu'un sait comment attraper cette erreur. La coordonnée x avec la valeur 400 est en degrés c'est pourquoi l'erreur se produit.

Merci

Okay J'ai trouvé la solution. Dans SUDS, si vous entrez:

faults=False 

dans la définition du client, cela permet de détecter les erreurs et d'indiquer la cause de la panne. La ligne devrait être:

client = Client('http://file.wsdl', faults=False) 

Le poste que j'ai marqué comme la réponse correcte est également capable d'attraper qu'un problème est arrivé.

Merci à tous

Répondre

10

Si vous voulez attraper cette exception, vous devriez mettre

try: 
    result = client.service.AbsoluteMove(token, dest, speed) 
except suds.WebFault as detail: 
    ... 
+1

J'ai mis des défauts = False et essayé d'attraper suds.WebFault, mais toujours obtenir cette erreur « Aucun gestionnaire n'a pu être trouvée pour enregistreur « suds.client » –

1

Vous devez attraper suds.WebFault par les regards de cette retraçage. L'erreur elle-même semble légitime, IE, vos requêtes sont exécutées correctement, mais vos paramètres sont peut-être faux dans le contexte donné.

0

Je crois que vous faites référence à un message de diagnostic inoffensif dans votre commentaire. Je pouvais supprimer les messages de mousse en appelant logging.error() en affectant logging.INFO à basicConfig et logging.CRITICAL à suds.client.

https://fedorahosted.org/suds/wiki/Documentation

15

Si vous avez géré toutes les exceptions et erreurs dans votre code et votre code fonctionne très bien mais vous obtenez avec votre message ci-dessous une sortie correcte.

Msg: "Aucun gestionnaire n'a pu être trouvée pour enregistreur suds.client"

Ensuite, une solution simple est d'ajouter cette ligne

logging.getLogger('suds.client').setLevel(logging.CRITICAL) 

dans yourclient.py fichier juste après tout instruction d'importation.

+8

et ne pas oublier: ' importation logging' –

+3

qui supprime le débogage du client ne corrige pas le problème Pour que la fonction de journalisation suds.client soit exécutée, vous devez d'abord faire un appel à logging.basicConfig, par exemple: 'logging.basicConfig (level = logging.INFO)' – FlipMcF

Questions connexes