Обработка ошибок в Python с помощью SUDS - PullRequest
14 голосов
/ 18 января 2010

Я пытался управлять камерой через файл wsdl, используя 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() 

Ошибка ниже:

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'

Я не уверен, какое исключение мне следует здесь использовать. Кто-нибудь знает, как отловить эту ошибку. Координата x со значением 400 указывается в градусах, поэтому возникает ошибка.

Спасибо

Хорошо, я нашел решение. В SUDS, если вы введете:

faults=False

в определении клиента, это ловит ошибки и дает причину, по которой произошла ошибка. В строке должно быть написано:

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

Пост, который я пометил как правильный ответ, также может обнаружить, что возникла проблема.

Спасибо всем

Ответы [ 4 ]

15 голосов
/ 10 октября 2011

Если вы обработали все исключения и ошибки в своем коде, и ваш код работает нормально, но вы все равно получаете сообщение ниже с правильным выводом.

Msg: «Не удалось найти обработчики для регистратора suds.client»

Тогда простое решение - добавить эту строку

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

в yourclient.py файл простопосле всего оператора импорта.

11 голосов
/ 18 января 2010

Если вы хотите поймать это исключение, вы должны поставить

try:
    result = client.service.AbsoluteMove(token, dest, speed)
except suds.WebFault as detail:
    ...
1 голос
/ 18 января 2010

Вам нужно поймать suds.WebFault по внешнему виду этого обратного следа. Сама ошибка кажется допустимой, IE, ваши запросы выполняются правильно, но, возможно, ваши параметры неверны в данном контексте.

0 голосов
/ 09 августа 2011

Я полагаю, вы ссылаетесь на безвредное диагностическое сообщение в своем комментарии.Я могу подавить сообщения от suds, вызывающих logging.error(), назначив logging.INFO на basicConfig и logging.CRITICAL на suds.client.

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

...