How do we handle Python xmlrpclib Connection Refused?

匿名 (未验证) 提交于 2019-12-03 08:52:47

问题:

I don't know what the heck I'm doing wrong here, I wrote have an RPC client trying to connect to a non-existent server, and I'm trying to handle the exception that is thrown, but no matter what I try I can't figure out how I'm supposed to handle this:

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" 

Since there is no server running, I would expect the output to be "No RPC" but instead I get an exception:

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 

回答1:

_get_rpc returns a reference to unconnected ServerProxy's supervisor method. The exception isn't happening in the call to _get_rpc where you handle it; it's happening when you try to evaluate this supervisor method (in "if not rpc"). Try from the interactive prompt:

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> 

Note how you see the exception when trying to evaluate the .supervisor method (ServerProxy(...).supervisor, foo.supervisor, or bar), but not when just assigning it elsewhere (bar = foo.supervisor).



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!