Issue 0083
- Summary
- unicode exception handling on Jenkins error
- Owner
- Tim
- Reporter
- Laszlo Sitzer
- Status
- closed
- Priority
- medium
- Version
- 1.5
- Subsystem
- ftc
- Tags
- python, unicode, exception
Description [edit section]
If Jenkins returns an error, you get an exception. While printing the exception, then you can get a second exception because of the use of str(e), which throws a UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position xxxx: ordinal not in range(128)Here is the exception:
# ftc add-nodes -b bbb Traceback (most recent call last): File "/usr/local/bin/ftc", line 5625, in <module> main() File "/usr/local/bin/ftc", line 5553, in main sys.exit(str(e) + '\n' + command_help['add-nodes'][1]) UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 4199: ordinal not in range(128)
The problem is that the exception comes from the jenkins module, which uses str() on the text returned from the web server, which apparently has a unicode '\xa0' character in it. (Unicode a0 is a non-breaking space)
I'd like to print out the text returned from the server, but I don't know how to query the exception for it, without the server trying to convert the text using the str() function.
If the default encoding for python is 'utf-8', instead of ascii, then things work better. I was able to work around this by doing:
but that is apparently an unnapproved way of handling this. The reload is required because the attribute 'setdefaultencoding' is used during sys import, but then deleted before the module becomes active.
Another possible solution is putting this at the top of the file:
OK - that doesn't work.
Another method to do this would be to make a safe_str_and_exit() which should only be called on an error path.
This would do the reload(sys) and sys.setdefaultencoding('utf8'), but only at error time, so that ftc doesn't have to suffer the overhead of these operations in the non-error case.
Notes [edit section]
Fixed with commit 600c12ff - using the safe_str_and_exit routine
- backlink