diff options
author | Nico-Posada <102486290+Nico-Posada@users.noreply.github.com> | 2024-12-20 19:20:31 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-20 19:20:31 (GMT) |
commit | 3879ca0100942ae15a09ac22889cbe3e46d424eb (patch) | |
tree | 366ec8e3dcc8f834b8666916af4da447eaa7f48d /Lib | |
parent | 5a584c8f54bbeceae7ffa501291e29b7ddc8a0b9 (diff) | |
download | cpython-3879ca0100942ae15a09ac22889cbe3e46d424eb.zip cpython-3879ca0100942ae15a09ac22889cbe3e46d424eb.tar.gz cpython-3879ca0100942ae15a09ac22889cbe3e46d424eb.tar.bz2 |
gh-128049: Fix type confusion bug with the return value of a custom ExceptionGroup split function (#128079)
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_except_star.py | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/Lib/test/test_except_star.py b/Lib/test/test_except_star.py index c49c600..284907f 100644 --- a/Lib/test/test_except_star.py +++ b/Lib/test/test_except_star.py @@ -952,6 +952,49 @@ class TestExceptStarExceptionGroupSubclass(ExceptStarTest): self.assertExceptionIsLike(tes, FalsyEG("eg", [TypeError(1)])) self.assertExceptionIsLike(ves, FalsyEG("eg", [ValueError(2)])) + def test_exception_group_subclass_with_bad_split_func(self): + # see gh-128049. + class BadEG1(ExceptionGroup): + def split(self, *args): + return "NOT A 2-TUPLE!" + + class BadEG2(ExceptionGroup): + def split(self, *args): + return ("NOT A 2-TUPLE!",) + + eg_list = [ + (BadEG1("eg", [OSError(123), ValueError(456)]), + r"split must return a tuple, not str"), + (BadEG2("eg", [OSError(123), ValueError(456)]), + r"split must return a 2-tuple, got tuple of size 1") + ] + + for eg_class, msg in eg_list: + with self.assertRaisesRegex(TypeError, msg) as m: + try: + raise eg_class + except* ValueError: + pass + except* OSError: + pass + + self.assertExceptionIsLike(m.exception.__context__, eg_class) + + # we allow tuples of length > 2 for backwards compatibility + class WeirdEG(ExceptionGroup): + def split(self, *args): + return super().split(*args) + ("anything", 123456, None) + + try: + raise WeirdEG("eg", [OSError(123), ValueError(456)]) + except* OSError as e: + oeg = e + except* ValueError as e: + veg = e + + self.assertExceptionIsLike(oeg, WeirdEG("eg", [OSError(123)])) + self.assertExceptionIsLike(veg, WeirdEG("eg", [ValueError(456)])) + class TestExceptStarCleanup(ExceptStarTest): def test_sys_exception_restored(self): |