| 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 | 
|  | 
|  |