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]

Reply via email to