使用SUDS在Python中处理错误

14 投票
4 回答
31627 浏览
提问于 2025-04-15 18:09

我一直在尝试通过一个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 个回答

1

根据这个错误信息,你需要处理一下 suds.WebFault。这个错误看起来是合理的,也就是说,你的请求是正确执行的,但可能是你传入的参数在这个情况下不对。

15

如果你在代码中处理了所有的异常和错误,代码运行得也很好,但还是出现了下面这个提示,同时你的输出是正确的:

提示信息: "找不到处理程序来处理日志记录器 suds.client"

那么一个简单的解决办法就是在你的代码文件中添加这一行:

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

把它放在 yourclient.py 文件中所有导入语句之后。

12

如果你想捕捉到那个异常,你应该放置以下代码:

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

撰写回答