Irit Katriel <[email protected]> added the comment:
For the issue of which contexts need to be suppressed when __suppress_context__
is true, I think we don't need to keep the whole tree of exceptions. It might
be enough to save the dynamic "nesting depth of the try-excepts". Here is a
solution with two integers per exception, plus one on the thread state. Would
it work?
We add an int field called except_depth to the thread state (incremented in
ceval just before the try of a try-except and decremented after the last
except: block).
Whenever an exception is caught, this value is copied to it (to a new int we
put on BaseException, call it depth).
The __suppress_context__ field we change from bool to int (alternatively: add a
new field and leave this one alone). Instead of setting it to True when there
is __cause__, we set it to the except-depth of the raise...from that raised it.
Then the code displaying the traceback can use the depths information to
determine which contexts to suppress (the ones up to and not including the
first one with depth < the suppress_context value).
Returning to Nick's examples from 2013-11-08 14:34:
# No context on Exception3 is exactly what we want
try:
try:
raise Exception1
except Exception1:
raise Exception2
except Exception2 as exc
raise Exception3 from Exception2
Exception1 - depth = 2
Exception2 - depth = 1
Exception3 - depth = ? suppress_context = 1
(suppress both Exception1 and Exception2, they have depths >= 1)
# Not seeing Exception1 as the context for Exception3 is surprising!
try:
raise Exception1
except Exception1:
try:
raise Exception2
except Exception2 as exc
raise Exception3 from Exception2
Exception1 - depth = 1
Exception2 - depth = 2
Exception3 - depth = ? suppress_context = 2
(suppress only Exception2, Exception1 is too shallow)
To consider more elaborate nesting:
try:
try:
raise Exception0
except T: # Does not catch Exception0
pass
except Exception1:
try:
raise Exception2
except Exception2 as exc
raise Exception3 from Exception2
Whatever happens in the topmost try-block, if Exception0 is the context of
anything raised inside the "except Exception1" block, then its depth is 1
because it was caught by this except. So it won't be suppressed by anything
raised at a deeper level.
----------
nosy: +iritkatriel
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue18861>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com