diff options
author | Jianing YANG <jianingy@unitedstack.com> | 2013-07-22 15:15:57 +0800 |
---|---|---|
committer | Jianing YANG <jianingy@unitedstack.com> | 2013-07-26 20:52:04 +0800 |
commit | 2b83260feb910a72bceed93db2f4ebd59c692022 (patch) | |
tree | a64f545d461dcd4a49bf756ec662cf90749f7cee /heatclient/exc.py | |
parent | a49cf4c148bfcb4cf878afc13325f2ffcf219992 (diff) | |
download | python-heatclient-2b83260feb910a72bceed93db2f4ebd59c692022.tar.gz |
Parse error object (in json format) returned by heat-api
With this fix, heatclient will display a clear error message when
encounter an server-side error. Additionally, the corresponding
traceback will be displayed when "--verbose" is set.
Change-Id: I99b828465f61478a3c63fcf549d044a62523be1f
Diffstat (limited to 'heatclient/exc.py')
-rw-r--r-- | heatclient/exc.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/heatclient/exc.py b/heatclient/exc.py index c90b0fc..6996bf2 100644 --- a/heatclient/exc.py +++ b/heatclient/exc.py @@ -12,6 +12,13 @@ import sys +verbose = 0 + +try: + import json +except ImportError: + import simplejson as json + class BaseException(Exception): """An error occurred.""" @@ -38,6 +45,30 @@ 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 = json.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: %s\n%s' % (message, traceback) + else: + return 'ERROR: %s' % message + class HTTPMultipleChoices(HTTPException): code = 300 |