Hello, I'm trying to write exception-handling code that is OK in the presence of unicode error messages. I seem to have gotten all mixed up and I'd appreciate any un-mixing that anyone can give me.
I'm used to writing code like this. class myException(Exception): pass fn='README' try: f=open(fn,'r') except Exception, err: mesg='unable to open file'+fn+': '+str(err) raise myException, mesg But what if fn is non-ascii? The following code raises the dreaded (to me) UnicodeEncodeError. class myException(Exception): pass def fcnCall(): fn=u'a\N{LATIN SMALL LETTER O WITH DIAERESIS}k' try: # was: f=open(fn,'r') 2/0 # just substitute something that will raise an exception except Exception, err: mesg='unable to open file '+fn+': '+str(err) raise myException, mesg try: fcnCall() except Exception, err: print 'trouble calling fcnCall: '+str(err) Maybe my trouble is the "str()", which is supposed to return a regular string? (BTW, unicode() makes no difference, and help(BaseException) didn't give me any inspirations.) So I looked for an end-around past the str() call. As I understand lib/module-exceptions.html, "For class exceptions, [err] receives the exception instance. If the exception class is derived from the standard root class BaseException, the associated value is present as the exception instance's args attribute.", I should be able to get the string out of err.args. Sure enough, putting the above text into test.py and changing str(err) to repr(err.args) yields this. $ python test.py trouble calling fcnCall: (u'unable to open file a\xf6k: integer division or modulo by zero',) so that changing the above repr(err.args) to err.args[0] gives the desired result. $ python test.py trouble calling fcnCall: unable to open file aök: integer division or modulo by zero (In case this doesn't show up as I intended on your screen, I see an o with a diaeresis in the filename.) But the documentation "This may be a string or a tuple containing several items of information (e.g., an error code and a string explaining the code)." gives me no reason to believe that all exceptions have the desired unicode string as the 0-th element of the tuple. I confess that I'm unable to confidently read exceptions.c . No doubt I've missed something (I googled around the net and on this group but I didn't have any luck). I'd be grateful if someone could show me striaght. Thanks, Jim -- http://mail.python.org/mailman/listinfo/python-list