The behaviour depends on Python version and the environment. On Python 3 the character encoding error handler for sys.stderr
is always 'backslashreplace'
:
from __future__ import unicode_literals, print_function
import sys
s = 'unicode "\u2323" smile'
print(s)
print(s, file=sys.stderr)
try:
raise RuntimeError(s)
except Exception as e:
print(e.args[0])
print(e.args[0], file=sys.stderr)
raise
python3:
$ PYTHONIOENCODING=ascii:ignore python3 raise_unicode.py
unicode "" smile
unicode "\u2323" smile
unicode "" smile
unicode "\u2323" smile
Traceback (most recent call last):
File "raise_unicode.py", line 8, in <module>
raise RuntimeError(s)
RuntimeError: unicode "\u2323" smile
$ PYTHONIOENCODING=ascii:ignore python2 raise_unicode.py
unicode "" smile
unicode "" smile
unicode "" smile
unicode "" smile
Traceback (most recent call last):
File "raise_unicode.py", line 8, in <module>
raise RuntimeError(s)
RuntimeError
That is on my system the error message is eaten on python2.
Note: on Windows you could try:
T:\> set PYTHONIOENCODING=ascii:ignore
T:\> python raise_unicode.py
For comparison:
$ python3 raise_unicode.py
unicode "⌣" smile
unicode "⌣" smile
unicode "⌣" smile
unicode "⌣" smile
Traceback (most recent call last):
File "raise_unicode.py", line 8, in <module>
raise RuntimeError(s)
RuntimeError: unicode "⌣" smile