¿Cómo manejamos Python xmlrpclib Connection Refused?

No sé qué diablos estoy haciendo mal aquí, escribí que un cliente RPC intentara conectarse a un servidor inexistente, y estoy tratando de manejar la excepción que se produce, pero no importa lo que intente No puedo entender cómo debo manejar esto:

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" 

Como no hay ningún servidor en ejecución, esperaría que la salida fuera “No RPC”, pero en cambio obtendré una excepción:

 Traceback (most recent call last): File "xmlrpctest.py", line 20, in  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 devuelve una referencia al método supervisor de ServerProxy desconectado. La excepción no ocurre en la llamada a _get_rpc donde la manejas; está sucediendo cuando intenta evaluar este método de supervisión (en “si no es rpc”). Prueba desde el indicador interactivo:

 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");  >>> xmlrpclib.ServerProxy("http://127.0.0.1").supervisor; Traceback (most recent call last): File "", line 1, in  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:  >>> 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 "", line 1, in  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:  >>> bar = foo.supervisor >>> bar Traceback (most recent call last): File "", line 1, in  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:  

Observe cómo ve la excepción cuando intenta evaluar el método de .supervisor (ServerProxy (…). Supervisor, foo.supervisor o bar), pero no cuando simplemente lo asigna a otro lugar (bar = foo.supervisor).