Index: boto/exception.py |
diff --git a/boto/exception.py b/boto/exception.py |
index 718be46f9c9ff3d48621f456b0ca46e459c1a7bd..bfdb052a73a6a7d20c3b62665c986a8568075ebd 100644 |
--- a/boto/exception.py |
+++ b/boto/exception.py |
@@ -35,8 +35,8 @@ class BotoClientError(StandardError): |
General Boto Client error (error accessing AWS) |
""" |
- def __init__(self, reason): |
- StandardError.__init__(self) |
+ def __init__(self, reason, *args): |
+ StandardError.__init__(self, reason, *args) |
self.reason = reason |
def __repr__(self): |
@@ -69,8 +69,8 @@ class GSPermissionsError(StoragePermissionsError): |
class BotoServerError(StandardError): |
- def __init__(self, status, reason, body=None): |
- StandardError.__init__(self) |
+ def __init__(self, status, reason, body=None, *args): |
+ StandardError.__init__(self, status, reason, body, *args) |
self.status = status |
self.reason = reason |
self.body = body or '' |
@@ -86,11 +86,12 @@ class BotoServerError(StandardError): |
h = handler.XmlHandler(self, self) |
xml.sax.parseString(self.body, h) |
except xml.sax.SAXParseException, pe: |
- # Go ahead and clean up anything that may have |
- # managed to get into the error data so we |
- # don't get partial garbage. |
- print "Warning: failed to parse error message from AWS: %s" % pe |
- self._cleanupParsedProperties() |
+ # Remove unparsable message body so we don't include garbage |
+ # in exception. But first, save self.body in self.error_message |
+ # because occasionally we get error messages from Eucalyptus |
+ # that are just text strings that we want to preserve. |
+ self.error_message = self.body |
+ self.body = None |
def __getattr__(self, name): |
if name == 'message': |
@@ -221,7 +222,7 @@ class SQSDecodeError(BotoClientError): |
Error when decoding an SQS message. |
""" |
def __init__(self, reason, message): |
- BotoClientError.__init__(self, reason) |
+ BotoClientError.__init__(self, reason, message) |
self.message = message |
def __repr__(self): |
@@ -358,14 +359,14 @@ class InvalidUriError(Exception): |
"""Exception raised when URI is invalid.""" |
def __init__(self, message): |
- Exception.__init__(self) |
+ Exception.__init__(self, message) |
self.message = message |
class InvalidAclError(Exception): |
"""Exception raised when ACL XML is invalid.""" |
def __init__(self, message): |
- Exception.__init__(self) |
+ Exception.__init__(self, message) |
self.message = message |
class NoAuthHandlerFound(Exception): |
@@ -390,11 +391,21 @@ class ResumableTransferDisposition(object): |
START_OVER = 'START_OVER' |
# WAIT_BEFORE_RETRY means the resumable transfer failed but that it can |
- # be retried after a time delay. |
+ # be retried after a time delay within the current process. |
WAIT_BEFORE_RETRY = 'WAIT_BEFORE_RETRY' |
- # ABORT means the resumable transfer failed and that delaying/retrying |
- # within the current process will not help. |
+ # ABORT_CUR_PROCESS means the resumable transfer failed and that |
+ # delaying/retrying within the current process will not help. If |
+ # resumable transfer included a state tracker file the upload can be |
+ # retried again later, in another process (e.g., a later run of gsutil). |
+ ABORT_CUR_PROCESS = 'ABORT_CUR_PROCESS' |
+ |
+ # ABORT means the resumable transfer failed in a way that it does not |
+ # make sense to continue in the current process, and further that the |
+ # current tracker ID should not be preserved (in a tracker file if one |
+ # was specified at resumable upload start time). If the user tries again |
+ # later (e.g., a separate run of gsutil) it will get a new resumable |
+ # upload ID. |
ABORT = 'ABORT' |
class ResumableUploadException(Exception): |
@@ -405,7 +416,7 @@ class ResumableUploadException(Exception): |
""" |
def __init__(self, message, disposition): |
- Exception.__init__(self) |
+ Exception.__init__(self, message, disposition) |
self.message = message |
self.disposition = disposition |
@@ -421,7 +432,7 @@ class ResumableDownloadException(Exception): |
""" |
def __init__(self, message, disposition): |
- Exception.__init__(self) |
+ Exception.__init__(self, message, disposition) |
self.message = message |
self.disposition = disposition |