【问题标题】:How do we handle Python xmlrpclib Connection Refused?我们如何处理 Python xmlrpclib Connection Refused?
【发布时间】:2011-06-09 11:01:22
【问题描述】:

我不知道我在这里做错了什么,我写了一个 RPC 客户端试图连接到一个不存在的服务器,我正在尝试处理抛出的异常,但不管我尝试了什么我无法弄清楚我应该如何处理这个:

def _get_rpc():
    try:
        a = ServerProxy('http://dd:LNXFhcZnYshy5mKyOFfy@127.0.0.1:9001')
        a = a.supervisor
        return a
    except:
        return False

rpc = _get_rpc()
if not rpc:
    print "No RPC"

由于没有服务器在运行,我希望输出为“No RPC”,但我得到了一个异常:

Traceback (most recent call last):
  File "xmlrpctest.py", line 20, in <module>
    if not rpc:
  File "/usr/lib/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
  File "/usr/lib/python2.6/xmlrpclib.py", line 1235, in request
    self.send_content(h, request_body)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1349, in send_content
    connection.endheaders()
  File "/usr/lib/python2.6/httplib.py", line 908, in endheaders
    self._send_output()
  File "/usr/lib/python2.6/httplib.py", line 780, in _send_output
    self.send(msg)
  File "/usr/lib/python2.6/httplib.py", line 739, in send
    self.connect()
  File "/usr/lib/python2.6/httplib.py", line 720, in connect
    self.timeout)
  File "/usr/lib/python2.6/socket.py", line 561, in create_connection
    raise error, msg
socket.error: [Errno 111] Connection refused

【问题讨论】:

  • _get_rpc 返回对未连接的 ServerProxy 的主管方法的引用。异常没有发生你处理它的_get_rpc调用中;当您尝试评估此主管方法时(在“如果不是 rpc”中),就会发生这种情况。从交互式提示中尝试:- xmlrpclib.ServerProxy("127.0.0.1") -> - xmlrpclib.ServerProxy("127.0.0.1").supervisor -> 异常 - foo = xmlrpclib.ServerProxy("127.0.0.1") -> 没有 - dir(foo) -> 你可以看看这个对象是如何设置的 - foo -> 评估时出现相同的异常,它会调用方法
  • 现在更有意义了,谢谢。
  • @metamat:如果您将其转换为答案,@Anthony 可以将其选为正确的。 @Anthony,如果他不回应,就偷那个答案(或者我会)。

标签: python exception-handling xml-rpc xmlrpclib


【解决方案1】:

_get_rpc 返回对未连接的 ServerProxy 的主管方法的引用。在处理它的 _get_rpc 调用中没有发生异常;当您尝试评估此主管方法时(在“如果不是 rpc”中),就会发生这种情况。从交互式提示中尝试:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import xmlrpclib
>>> xmlrpclib.ServerProxy("http://127.0.0.1");
<ServerProxy for 127.0.0.1/RPC2>
>>> xmlrpclib.ServerProxy("http://127.0.0.1").supervisor;
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
  File "/usr/lib/python2.6/xmlrpclib.py", line 1243, in request
    headers
xmlrpclib.ProtocolError: <ProtocolError for 127.0.0.1/RPC2: 404 Not Found>
>>> foo = xmlrpclib.ServerProxy("http://127.0.0.1");
>>> dir (foo)
['_ServerProxy__allow_none', '_ServerProxy__encoding', '_ServerProxy__handler', '_ServerProxy__host', '_ServerProxy__request', '_ServerProxy__transport', '_ServerProxy__verbose', '__doc__', '__getattr__', '__init__', '__module__', '__repr__', '__str__']
>>> foo.supervisor
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
  File "/usr/lib/python2.6/xmlrpclib.py", line 1243, in request
    headers
xmlrpclib.ProtocolError: <ProtocolError for 127.0.0.1/RPC2: 404 Not Found>
>>> bar = foo.supervisor
>>> bar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
  File "/usr/lib/python2.6/xmlrpclib.py", line 1243, in request
    headers
xmlrpclib.ProtocolError: <ProtocolError for 127.0.0.1/RPC2: 404 Not Found>

请注意,在尝试评估 .supervisor 方法(ServerProxy(...).supervisor、foo.supervisor 或 bar)时,您是如何看到异常的,但在将其分配到其他地方时却没有(bar = foo.supervisor)。

【讨论】:

    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 2013-04-20
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多