使用SUDS在Python中进行错误处理

chr*_*ley 14 python web-services suds

我一直试图通过使用SUDS的wsdl文件来控制相机.我有代码工作,但我想将错误处理放入脚本.我尝试过不同的异常但无法使脚本正常工作.当我输入无效坐标时,我收到错误.我正在使用的代码如下,接着是我收到的错误.

#!/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() 
Run Code Online (Sandbox Code Playgroud)

错误如下:

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'
Run Code Online (Sandbox Code Playgroud)

我不确定我应该在这里使用哪个例外.有谁知道如何捕获此错误.值400的x坐标是度数,这就是错误发生的原因.

谢谢

好的,我找到了解决方案.在SUDS中,如果输入:

faults=False
Run Code Online (Sandbox Code Playgroud)

在客户定义中,这会捕获故障并说明故障发生的原因.该行应为:

client = Client('http://file.wsdl', faults=False)
Run Code Online (Sandbox Code Playgroud)

我标记为正确答案的帖子也能够发现问题已经发生.

谢谢大家

sha*_*ovo 15

如果您处理了代码中的所有异常和错误,并且您的代码工作正常,但仍然会收到正确输出的消息.

消息:"没有找到记录器的处理程序suds.client"

然后一个简单的解决方案就是添加这一行

logging.getLogger('suds.client').setLevel(logging.CRITICAL)
Run Code Online (Sandbox Code Playgroud)

yourclient.py所有import语句之后的文件中.

  • 并且不要忘记:`import logging` (8认同)
  • 这删除了客户端调试,它不能解决问题.要使suds.client日志记录工具运行,必须先执行logging.basicConfig调用.例如:`logging.basicConfig(level = logging.INFO)` (3认同)

fab*_*ioM 11

如果你想捕获该异常,你应该把它

try:
    result = client.service.AbsoluteMove(token, dest, speed)
except suds.WebFault as detail:
    ...
Run Code Online (Sandbox Code Playgroud)