Handle communication failures cleanly

Expand exceptions to cover more failures cases. This adds
CommunicationFailure to represent any failures while attempting
to communicate with the remote endpoint. This also adds a new base
exception class BaseException which should be used for all non-HTTP
related failures.

Change-Id: Ie3e1d45c520d816a3f491a85fde94a6c4edf295e
This commit is contained in:
Brian Waldon
2012-08-08 13:45:38 -07:00
parent 4b59f66494
commit 3997f977fa
2 changed files with 31 additions and 9 deletions

View File

@@ -75,7 +75,11 @@ class HTTPClient(object):
def get_connection(self):
_class = self.connection_params[0]
return _class(*self.connection_params[1], **self.connection_params[2])
try:
return _class(*self.connection_params[1],
**self.connection_params[2])
except httplib.InvalidUrl:
raise exc.InvalidEndpoint()
def log_curl_request(self, method, url, kwargs):
curl = ['curl -i -X %s' % method]
@@ -126,10 +130,17 @@ class HTTPClient(object):
kwargs['headers'].setdefault('X-Auth-Token', self.auth_token)
self.log_curl_request(method, url, kwargs)
conn = self.get_connection()
conn.request(method, url, **kwargs)
resp = conn.getresponse()
try:
conn.request(method, url, **kwargs)
except (socket.error, socket.gaierror):
raise exc.InvalidEndpoint()
try:
resp = conn.getresponse()
except (socket.error, socket.timeout):
raise exc.CommunicationError()
body_iter = ResponseBodyIterator(resp)

View File

@@ -16,14 +16,25 @@
import sys
class CommandError(Exception):
class BaseException(Exception):
"""An error occurred."""
def __init__(self, message=None):
self.message = message
def __str__(self):
return self.message or self.__class__.__doc__
class CommandError(BaseException):
"""Invalid usage of CLI"""
pass
class InvalidEndpoint(ValueError):
"""The provided endpoint could not be used"""
pass
class InvalidEndpoint(BaseException):
"""The provided endpoint is invalid."""
class CommunicationError(BaseException):
"""Unable to communicate with server."""
class ClientException(Exception):