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.
|
lands in mainstream packages.
|
||||||
"""
|
"""
|
||||||
return self.fd.getsockopt(*args, **kwargs)
|
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'
|
print >> sys.stderr, '... terminating glance client'
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print >> sys.stderr, e
|
print >> sys.stderr, utils.exception_to_str(e)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
@@ -93,3 +93,18 @@ class TestUtils(testtools.TestCase):
|
|||||||
| Key | Value |
|
| 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