summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorNico-Posada <102486290+Nico-Posada@users.noreply.github.com>2024-12-20 19:20:31 (GMT)
committerGitHub <noreply@github.com>2024-12-20 19:20:31 (GMT)
commit3879ca0100942ae15a09ac22889cbe3e46d424eb (patch)
tree366ec8e3dcc8f834b8666916af4da447eaa7f48d /Lib
parent5a584c8f54bbeceae7ffa501291e29b7ddc8a0b9 (diff)
downloadcpython-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.py43
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):