diff --git a/elasticsearch/exceptions.py b/elasticsearch/exceptions.py index 2bfbc769..c0ea4ee0 100644 --- a/elasticsearch/exceptions.py +++ b/elasticsearch/exceptions.py @@ -54,8 +54,11 @@ class TransportError(ElasticsearchException): def __str__(self): cause = '' try: - if self.info: - cause = ', %r' % self.info['error']['root_cause'][0]['reason'] + if self.info and 'error' in self.info: + if isinstance(self.info['error'], dict): + cause = ', %r' % self.info['error']['root_cause'][0]['reason'] + else: + cause = ', %r' % self.info['error'] except LookupError: pass return '%s(%s, %r%s)' % (self.__class__.__name__, self.status_code, self.error, cause) diff --git a/test_elasticsearch/test_exceptions.py b/test_elasticsearch/test_exceptions.py new file mode 100644 index 00000000..985518de --- /dev/null +++ b/test_elasticsearch/test_exceptions.py @@ -0,0 +1,23 @@ +from elasticsearch.exceptions import TransportError + +from .test_cases import TestCase + + +class TestTransformError(TestCase): + def test_transform_error_parse_with_error_reason(self): + e = TransportError(500, 'InternalServerError', { + 'error': { + 'root_cause': [ + {"type": "error", "reason": "error reason"} + ] + } + }) + + self.assertEqual(str(e), "TransportError(500, 'InternalServerError', 'error reason')") + + def test_transform_error_parse_with_error_string(self): + e = TransportError(500, 'InternalServerError', { + 'error': 'something error message' + }) + + self.assertEqual(str(e), "TransportError(500, 'InternalServerError', 'something error message')")