Encode error messages before sending them to stdout
When an error with non-ascii characters is caught by glanceclient, it fails at printing it and exists with a UnicodeEncodedError. This patch encodes errors' messages using strutils before sending them to stdout. Fixes bug: #1200206 Change-Id: I4dabcd76ffb258840bd6a66ad23c030f34960e86
This commit is contained in:
@@ -202,3 +202,15 @@ def getsockopt(self, *args, **kwargs):
|
||||
lands in mainstream packages.
|
||||
"""
|
||||
return self.fd.getsockopt(*args, **kwargs)
|
||||
|
||||
|
||||
def exception_to_str(exc):
|
||||
try:
|
||||
error = unicode(exc)
|
||||
except UnicodeError:
|
||||
try:
|
||||
error = str(exc)
|
||||
except UnicodeError:
|
||||
error = ("Caught '%(exception)s' exception." %
|
||||
{"exception": exc.__class__.__name__})
|
||||
return strutils.safe_encode(error, errors='ignore')
|
||||
|
@@ -472,5 +472,5 @@ def main():
|
||||
print >> sys.stderr, '... terminating glance client'
|
||||
sys.exit(1)
|
||||
except Exception as e:
|
||||
print >> sys.stderr, e
|
||||
print >> sys.stderr, utils.exception_to_str(e)
|
||||
sys.exit(1)
|
||||
|
@@ -93,3 +93,18 @@ class TestUtils(testtools.TestCase):
|
||||
| Key | Value |
|
||||
+----------+-------+
|
||||
''')
|
||||
|
||||
def test_exception_to_str(self):
|
||||
class FakeException(Exception):
|
||||
def __str__(self):
|
||||
raise UnicodeError()
|
||||
|
||||
ret = utils.exception_to_str(Exception('error message'))
|
||||
self.assertEqual(ret, 'error message')
|
||||
|
||||
ret = utils.exception_to_str(Exception('\xa5 error message'))
|
||||
self.assertEqual(ret, ' error message')
|
||||
|
||||
ret = utils.exception_to_str(FakeException('\xa5 error message'))
|
||||
self.assertEqual(ret, "Caught '%(exception)s' exception." %
|
||||
{'exception': 'FakeException'})
|
||||
|
Reference in New Issue
Block a user