Python中使用SUDS进行错误处理

14

我一直在尝试使用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() 

错误信息如下:

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

如果你的代码中处理了所有的异常和错误,代码能够正常运行,但是你仍然在正确输出时收到以下信息:

Msg : "No handlers could be found for logger suds.client"

那么一个简单的解决方案是添加这一行:

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

yourclient.py文件中,紧接着所有导入语句之后。


8
请导入日志记录模块:import logging - Ivan Marinov
3
去除客户端调试并不能解决问题,要开启suds.client日志记录功能,需要先进行logging.basicConfig调用。例如:logging.basicConfig(level=logging.INFO) - FlipMcF

12

如果你想捕获那个异常,你应该放置

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

1
我已经将faults=False设置为False,并尝试捕获suds.WebFault,但仍然出现错误“找不到与'suds.client'相关的处理程序”。 - IgorGanapolsky

1

从回溯信息来看,你需要捕获suds.WebFault。错误本身似乎是合法的,也就是说,你的请求被正确执行了,但在给定的上下文中,可能你的参数有误。


0

我相信你在评论中提到的是一个无害的诊断信息。我可以通过将basicConfigsuds.client分别赋值为logging.INFOlogging.CRITICAL来抑制来自suds调用logging.error()的消息。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接