From 8efc8cb25ac4258295dd5e7b359e38c22ba34fc8 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Fri, 16 Apr 2021 16:06:09 +0100 Subject: [PATCH] bpo-38530: Match exactly AttributeError and NameError when offering suggestions --- Lib/test/test_exceptions.py | 15 +++++++++++++++ Python/suggestions.c | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index ebeb67b4512822..bd20b232e541fe 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1537,6 +1537,21 @@ def f(): self.assertNotIn("blech", err.getvalue()) + def test_unbound_local_error_doesn_not_match(self): + def foo(): + something = 3 + print(somethong) + somethong = 3 + + try: + foo() + except UnboundLocalError as exc: + with support.captured_stderr() as err: + sys.__excepthook__(*sys.exc_info()) + + self.assertNotIn("something", err.getvalue()) + + class AttributeErrorTests(unittest.TestCase): def test_attributes(self): # Setting 'attr' should not be a problem. diff --git a/Python/suggestions.c b/Python/suggestions.c index 258e3f1833e6b5..e4227609207390 100644 --- a/Python/suggestions.c +++ b/Python/suggestions.c @@ -181,9 +181,9 @@ offer_suggestions_for_name_error(PyNameErrorObject *exc) { PyObject *_Py_Offer_Suggestions(PyObject *exception) { PyObject *result = NULL; assert(!PyErr_Occurred()); - if (PyErr_GivenExceptionMatches(exception, PyExc_AttributeError)) { + if (Py_IS_TYPE(exception, (PyTypeObject*)PyExc_AttributeError)) { result = offer_suggestions_for_attribute_error((PyAttributeErrorObject *) exception); - } else if (PyErr_GivenExceptionMatches(exception, PyExc_NameError)) { + } else if (Py_IS_TYPE(exception, (PyTypeObject*)PyExc_NameError)) { result = offer_suggestions_for_name_error((PyNameErrorObject *) exception); } return result;