Skip to content

Commit

Permalink
pythongh-113358: Fix rendering tracebacks with exceptions with a brok…
Browse files Browse the repository at this point in the history
…en __getattr__ (pythonGH-113359)

Co-authored-by: Irit Katriel <[email protected]>
  • Loading branch information
2 people authored and aisk committed Feb 11, 2024
1 parent 2bf9825 commit cb1bc3f
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
14 changes: 14 additions & 0 deletions Lib/test/test_traceback.py
Original file line number Diff line number Diff line change
Expand Up @@ -2209,6 +2209,20 @@ 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 + "Ignored error getting __notes__: ValueError('no __notes__')\n")

def test_exception_with_multiple_notes(self):
for e in [ValueError(42), SyntaxError('bad syntax')]:
with self.subTest(e=e):
Expand Down
6 changes: 5 additions & 1 deletion Lib/traceback.py
Original file line number Diff line number Diff line change
Expand Up @@ -1051,7 +1051,11 @@ 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)
try:
self.__notes__ = getattr(exc_value, '__notes__', None)
except Exception as e:
self.__notes__ = [
f'Ignored error getting __notes__: {_safe_string(e, '__notes__', repr)}']

self._is_syntax_error = False
self._have_exc_type = exc_type is not None
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix rendering tracebacks with exceptions with a broken __getattr__

0 comments on commit cb1bc3f

Please sign in to comment.