Message88965
I'm currently writing a library that executes predefined http requests
to a specified server. In case there is for example a HTTP Error, I want
to raise a user-defined exception that contains additional information
about when the error actually occured (so that the user of that library
gets information what happened without having to look at the actual
library code).
The in Python 3 introduced "feature" of chained exceptions (PEP 3134) is
something which is a bit annoying in that particular situation. While it
is probably good in a lot situation to know where an exception comes
from (especially when they are chained), it makes reading the actual
exception for the library user harder.
Let me show you an example:
def doXY ():
# ...
try:
page = urlopen( someRequest )
except urllib.error.URLError as e:
raise MyError( 'while doing XY', e )
# ...
MyError is an exception class, that uses the second parameter to get
additional information (for HTTPErrors the status code for example) and
compiles a detailed error message.
Before Python 3, this was a good way to prevent users from having to dig
into the code when they encounter an exception. Now however, you get
some error message like this:
-----
Traceback (most recent call last):
File "..", line ., in doXY
page = urlopen( someRequest )
File "..\lib\urllib\request.py", line 122,
in urlopen
return _opener.open(url, data, timeout)
File "..\lib\urllib\request.py", line 364,
in open
response = meth(req, response)
File "..\lib\urllib\request.py", line 476,
in http_response
'http', request, response, code, msg, hdrs)
File "..\lib\urllib\request.py", line 402,
in error
return self._call_chain(*args)
File "..\lib\urllib\request.py", line 336,
in _call_chain
result = func(*args)
File "..\lib\urllib\request.py", line 484,
in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: Unauthorized
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "..", line ., in <module>
doXY()
File "..", line ., in doXY
raise MyError( 'while doing XY', e )
MyError: 'HTTP Error 401 while doing XY (Unauthorized)'
-----
While the error message of MyError would be completely sufficient for
the user to know (and to fix by simply giving correct data) he is
flooded with a lot of information about the previously raised exception
instead with far too many unneccessary information.
So what I basically would like to have is some mechanism to prevent
Python from printing out all previous exception. As there is already the
'raise NewException from PreviousException' syntax, something like
'raise NewException from None' would be great, with explicitely stating
None to clear the buffer of previous exceptions.
Thanks you for any comments on this issue.
Patrick W. |
|
Date |
User |
Action |
Args |
2009-06-05 19:04:25 | poke | set | recipients:
+ poke |
2009-06-05 19:04:25 | poke | set | messageid: <1244228665.64.0.918101455838.issue6210@psf.upfronthosting.co.za> |
2009-06-05 19:04:24 | poke | link | issue6210 messages |
2009-06-05 19:04:23 | poke | create | |
|