summaryrefslogtreecommitdiff
path: root/heatclient/exc.py
diff options
context:
space:
mode:
authorJianing YANG <jianingy@unitedstack.com>2013-07-22 15:15:57 +0800
committerJianing YANG <jianingy@unitedstack.com>2013-07-26 20:52:04 +0800
commit2b83260feb910a72bceed93db2f4ebd59c692022 (patch)
treea64f545d461dcd4a49bf756ec662cf90749f7cee /heatclient/exc.py
parenta49cf4c148bfcb4cf878afc13325f2ffcf219992 (diff)
downloadpython-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.py31
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