Skip to content

Commit

Permalink
Fix rendering tracebacks with exceptions with a broken __getattr__
Browse files Browse the repository at this point in the history
  • Loading branch information
perrinjerome committed Dec 21, 2023
1 parent ca8b1d0 commit 1f40d5f
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
12 changes: 12 additions & 0 deletions Lib/test/test_traceback.py
Original file line number Diff line number Diff line change
Expand Up @@ -2209,6 +2209,18 @@ def __repr__(self):
err_msg = "b'please do not show me as numbers'"
self.assertEqual(self.get_report(e), vanilla + err_msg + '\n')

# an exception with a broken __getattr__ raising a non expected error
class BrokenException(Exception):
broken = False
def __getattr__(self, name):
if self.broken:
raise ValueError(f'no {name}')

e = BrokenException(123)
vanilla = self.get_report(e)
e.broken = True
self.assertEqual(self.get_report(e), vanilla)

def test_exception_with_multiple_notes(self):
for e in [ValueError(42), SyntaxError('bad syntax')]:
with self.subTest(e=e):
Expand Down
7 changes: 6 additions & 1 deletion Lib/traceback.py
Original file line number Diff line number Diff line change
Expand Up @@ -1051,7 +1051,12 @@ def __init__(self, exc_type, exc_value, exc_traceback, *, limit=None,
# Capture now to permit freeing resources: only complication is in the
# unofficial API _format_final_exc_line
self._str = _safe_string(exc_value, 'exception')
self.__notes__ = getattr(exc_value, '__notes__', None)
notes = None
try:
notes = getattr(exc_value, '__notes__', None)
except Exception:
pass
self.__notes__ = notes

self._is_syntax_error = False
self._have_exc_type = exc_type is not None
Expand Down

0 comments on commit 1f40d5f

Please sign in to comment.