https://github.com/python/cpython/commit/97b5f245136eb91bbc1aeddfcbf9bc571cedfdb5
commit: 97b5f245136eb91bbc1aeddfcbf9bc571cedfdb5
branch: main
author: Adam D. Thomas <[email protected]>
committer: ambv <[email protected]>
date: 2026-10-20T16:12:16-07:00
summary:
gh-129605: Add more exception handling when computing suggestions in
traceback.py (#129632)
files:
A Misc/NEWS.d/next/Library/2025-02-04-09-01-06.gh-issue-129605.wKGNXQ.rst
M Lib/test/test_traceback.py
M Lib/traceback.py
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index d5b00a3bb628cb..678538eb2539c7 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -5109,6 +5109,32 @@ def func():
actual = self.get_suggestion(func)
self.assertIn("forget to import '_io'", actual)
+ def test_name_error_with_bad_getattr(self):
+ class A:
+ def __getattr__(self, x):
+ spam
+
+ actual = self.get_suggestion(A(), "eggs")
+ self.assertIn("name 'spam' is not defined", actual)
+
+ def test_name_error_with_bad_getattribute(self):
+
+ class A:
+ def __getattribute__(self, x):
+ spam
+
+ actual = self.get_suggestion(A(), "eggs")
+ self.assertIn("name 'spam' is not defined", actual)
+
+ def test_name_error_with_bad_property(self):
+ class A:
+ @property
+ def eggs(self):
+ eggs
+
+ actual = self.get_suggestion(A(), "eggs")
+ self.assertIn("name 'eggs' is not defined", actual)
+
class PurePythonSuggestionFormattingTests(
diff --git a/Lib/traceback.py b/Lib/traceback.py
index dcdab1f12e9a16..9c34624b90460a 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -1954,31 +1954,34 @@ def _compute_suggestion_error(exc_value, tb,
wrong_name):
return None
else:
assert isinstance(exc_value, NameError)
- # find most recent frame
- if tb is None:
+ try:
+ # find most recent frame
+ if tb is None:
+ return None
+ while tb.tb_next is not None:
+ tb = tb.tb_next
+ frame = tb.tb_frame
+ d = (
+ list(frame.f_locals)
+ + list(frame.f_globals)
+ + list(frame.f_builtins)
+ )
+ d = [x for x in d if isinstance(x, str)]
+ if not_normalized and wrong_name in d:
+ return wrong_name
+
+ # Check first if we are in a method and the instance
+ # has the wrong name as attribute
+ if 'self' in frame.f_locals:
+ self = frame.f_locals['self']
+ try:
+ has_wrong_name = hasattr(self, wrong_name)
+ except Exception:
+ has_wrong_name = False
+ if has_wrong_name:
+ return f"self.{wrong_name}"
+ except Exception:
return None
- while tb.tb_next is not None:
- tb = tb.tb_next
- frame = tb.tb_frame
- d = (
- list(frame.f_locals)
- + list(frame.f_globals)
- + list(frame.f_builtins)
- )
- d = [x for x in d if isinstance(x, str)]
- if not_normalized and wrong_name in d:
- return wrong_name
-
- # Check first if we are in a method and the instance
- # has the wrong name as attribute
- if 'self' in frame.f_locals:
- self = frame.f_locals['self']
- try:
- has_wrong_name = hasattr(self, wrong_name)
- except Exception:
- has_wrong_name = False
- if has_wrong_name:
- return f"self.{wrong_name}"
if not_normalized and wrong_name in d:
return wrong_name
diff --git
a/Misc/NEWS.d/next/Library/2025-02-04-09-01-06.gh-issue-129605.wKGNXQ.rst
b/Misc/NEWS.d/next/Library/2025-02-04-09-01-06.gh-issue-129605.wKGNXQ.rst
new file mode 100644
index 00000000000000..9dcf05913870b9
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-02-04-09-01-06.gh-issue-129605.wKGNXQ.rst
@@ -0,0 +1 @@
+Improve exception handling when computing suggestions in traceback.py. This
fixes a bug that could cause PyREPL to exit unexpectedly.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]