2010-01-18 14 views
13

He estado tratando de controlar una cámara a través de un archivo wsdl usando SUDS. Tengo el código funcionando pero quiero colocar el manejo de errores en el script. He intentado diferentes excepciones pero no puedo hacer que el script funcione. Cuando ingreso una coordenada no válida, aparece un error. El código que estoy usando está debajo seguido por el error que estoy recibiendo.Error al manejar en Python con 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() 

El error es el siguiente:

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' 

No estoy seguro de qué excepción que debería usar aquí. ¿Alguien sabe cómo detectar este error? La coordenada x con el valor 400 está en grados, por eso ocurre el error.

Gracias

Bien He encontrado la solución. En SUDS si ingresa:

faults=False 

en la definición del cliente, esto detecta fallas y da la razón por la cual ocurrió la falla. La línea debe decir:

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

el post que he marcado como la respuesta correcta es también capaz de atrapar un problema que ha sucedido.

Gracias a todos

Respuesta

10

Si se desea capturar la excepción de que se debería poner

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

he puesto faltas = False y trató de coger suds.WebFault, pero aún así conseguir que el error "No hay manipuladores hemos encontrado nada con logger 'suds.client' –

1

usted necesita coger suds.WebFault por el aspecto de que el rastreo. El error en sí parece legítimo, por ejemplo, sus solicitudes se están ejecutando correctamente, pero tal vez sus parámetros son incorrectos en el contexto dado.

0

creo que se refieren a un mensaje de diagnóstico inofensivo en su comentario. Podría suprimir mensajes de espuma llamando al logging.error() asignando logging.INFO a basicConfig y logging.CRITICAL a suds.client.

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

15

Si maneja todas las excepciones y errores en el código y el código está trabajando muy bien, pero todavía se están recibiendo a continuación con su mensaje de salida correcta.

de error: "No hay manipuladores hemos encontrado nada con registrador suds.client"

A continuación, una solución simple es añadir esta línea

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

en yourclient.py archivo justo antes de toda declaración de importación.

+8

y no se olvide: ' importación logging' –

+3

que elimina la depuración del cliente, no soluciona el problema. Para ejecutar el recurso de registro suds.client, primero debe hacer una llamada a logging.basicConfig, por ejemplo: 'logging.basicConfig (level = logging.INFO)' – FlipMcF

Cuestiones relacionadas