diff --git a/senlinclient/common/exc.py b/senlinclient/common/exc.py index 04771b1d..8eda0e3e 100644 --- a/senlinclient/common/exc.py +++ b/senlinclient/common/exc.py @@ -23,5 +23,40 @@ class BaseException(Exception): class CommandError(BaseException): '''Invalid usage of CLI.''' + class FileFormatError(BaseException): '''Illegal file format detected.''' + + +class HTTPException(BaseException): + """Base exception for all HTTP-derived exceptions.""" + code = 'N/A' + + def __init__(self, message=None): + super(HTTPException, self).__init__(message) + try: + self.error = jsonutils.loads(message) + if 'error' not in self.error: + raise KeyError(_('Key "error" not exists')) + except KeyError: + # NOTE(jianingy): If key 'error' happens not exist, + # self.message becomes no sense. In this case, we + # return doc of current exception class instead. + self.error = {'error': + {'message': self.__class__.__doc__}} + except Exception: + self.error = {'error': + {'message': self.message or self.__class__.__doc__}} + + def __str__(self): + message = self.error['error'].get('message', 'Internal Error') + if verbose: + traceback = self.error['error'].get('traceback', '') + return (_('ERROR: %(message)s\n%(traceback)s') % + {'message': message, 'traceback': traceback}) + else: + return _('ERROR: %s') % message + + +class HTTPNotFound(HTTPException): + code = 404