From afb2c80b29897fba37bfca718df6c4b25c25a166 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Thu, 18 Apr 2002 18:06:20 +0000 Subject: [PATCH] ceval.c/do_raise(): Tighten the test to disallow raising an instance of a str subclass. test_descr.py/string_exceptions(): New sub-test. For 2.3 only. Guido doesn't want this backported. --- Lib/test/test_descr.py | 26 ++++++++++++++++++++++++++ Python/ceval.c | 5 ++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 308ed44cf04..353d0f28b4c 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -2974,6 +2974,31 @@ def docdescriptor(): vereq(NewClass.__doc__, 'object=None; type=NewClass') vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass') +def string_exceptions(): + if verbose: + print "Testing string exceptions ..." + + # Ensure builtin strings work OK as exceptions. + astring = "An exception string." + try: + raise astring + except astring: + pass + else: + raise TestFailed, "builtin string not usable as exception" + + # Ensure string subclass instances do not. + class MyStr(str): + pass + + newstring = MyStr("oops -- shouldn't work") + try: + raise newstring + except TypeError: + pass + except: + raise TestFailed, "string subclass allowed as exception" + def test_main(): class_docstrings() lists() @@ -3039,6 +3064,7 @@ def test_main(): funnynew() imulbug() docdescriptor() + string_exceptions() if verbose: print "All OK" if __name__ == "__main__": diff --git a/Python/ceval.c b/Python/ceval.c index a93ceea1284..4e08a2af0a8 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2743,7 +2743,10 @@ do_raise(PyObject *type, PyObject *value, PyObject *tb) Py_DECREF(tmp); } - if (PyString_Check(type)) + if (PyString_CheckExact(type)) + /* Raising builtin string is deprecated but still allowed -- + * do nothing. Raising an instance of a new-style str + * subclass is right out. */ ; else if (PyClass_Check(type))