Converting Exception to a string in Python 3
does anyone have an idea, why this Python 3.2 code
try:
raise Exception('X')
except Exception as e:
print("Error {0}".format(str(e)))
works without problem (apart of unicode encoding in windows shell :/), but this
try:
raise Exception('X')
except Exception as e:
print("Error {0}".format(str(e, encoding = 'utf-8')))
throws TypeError: coercing to str: need bytes, bytearray or buffer-like object, Exception found ?
How to convert an Error to a string with custom encoding?
Edit
It does not works either, if there is \u2019 in message:
try:
raise Exception(msg)
except Exception as e:
b = bytes(str(e), encoding = 'utf-8')
print("Error {0}".format(str(b, encoding = 'utf-8')))
But why cannot str() convert an exception internally to bytes?
Solution 1:
In Python 3.x, str(e)
should be able to convert any Exception
to a string, even if it contains Unicode characters.
So unless your exception actually returns an UTF-8 encoded byte array in its custom __str__()
method, str(e, 'utf-8')
will not work as expected (it would try to interpret a 16bit Unicode character string in RAM as an UTF-8 encoded byte array ...)
My guess is that your problem isn't str()
but the print()
(i.e. the step which converts the Python Unicode string into something that gets dumped on your console). See this answer for solutions: Python, Unicode, and the Windows console
Solution 2:
Try this, it should work.
try:
raise Exception('X')
except Exception as e:
print("Error {0}".format(str(e.args[0])).encode("utf-8"))
Considering you have only a message in your internal tuple.
Solution 3:
In Python3, string
does not have such attribute as encoding. It's always unicode internally. For encoded strings, there are byte arrays:
s = "Error {0}".format(str(e)) # string
utf8str = s.encode("utf-8") # byte array, representing utf8-encoded text