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'

ここでどの例外を使用すべきかわかりません。このエラーをキャッチする方法を知っている人はいますか。値 400 の x 座標は度単位であるため、エラーが発生します。

ありがとう

さて、私は解決策を見つけました。SUDS で次のように入力した場合:

faults=False

クライアント定義に追加すると、これにより障害がキャッチされ、障害が発生した理由が示されます。行は次のようになります。

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

私が正解としてマークした投稿も、問題が発生したことをキャッチできます。

皆さんありがとう

4

4 に答える 4

15

コード内のすべての例外とエラーを処理し、コードは正常に機能しているが、それでも正しい出力で以下のメッセージが表示される場合。

メッセージ:「ロガーのハンドラーが見つかりませんでしたsuds.client

次に、簡単な解決策は、この行を追加することです

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

yourclient.pyすべてのインポートステートメントの直後のファイル。

于 2011-10-10T12:02:31.447 に答える
11

その例外をキャッチしたい場合は、

try:
    result = client.service.AbsoluteMove(token, dest, speed)
except suds.WebFault as detail:
    ...
于 2010-01-18T10:06:00.967 に答える
1

suds.WebFaultそのトレースバックの外観でキャッチする必要があります。エラー自体は正当なようです、IE、リクエストは正しく実行されていますが、特定のコンテキストでパラメーターが間違っている可能性があります。

于 2010-01-18T10:02:23.890 に答える
0

コメントで無害な診断メッセージに言及していると思います。とにlogging.error()割り当てることlogging.INFOで、 suds 呼び出しからのメッセージを抑制することができました。basicConfiglogging.CRITICALsuds.client

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

于 2011-08-09T19:50:32.123 に答える