gh-123440: Improve error message for except as used with not a name (#123442)

This commit is contained in:
sobolevn 2024-08-30 19:21:59 +03:00 committed by GitHub
parent d8e69b2c1b
commit e451a8937d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 2025 additions and 1715 deletions

View file

@ -1359,6 +1359,36 @@ Custom error message for try block mixing except and except*
Traceback (most recent call last):
SyntaxError: cannot have both 'except' and 'except*' on the same 'try'
Better error message for using `except as` with not a name:
>>> try:
... pass
... except TypeError as obj.attr:
... pass
Traceback (most recent call last):
SyntaxError: cannot use except statement with attribute
>>> try:
... pass
... except TypeError as obj[1]:
... pass
Traceback (most recent call last):
SyntaxError: cannot use except statement with subscript
>>> try:
... pass
... except* TypeError as (obj, name):
... pass
Traceback (most recent call last):
SyntaxError: cannot use except* statement with tuple
>>> try:
... pass
... except* TypeError as 1:
... pass
Traceback (most recent call last):
SyntaxError: cannot use except* statement with literal
Ensure that early = are not matched by the parser as invalid comparisons
>>> f(2, 4, x=34); 1 $ 2
Traceback (most recent call last):
@ -2770,6 +2800,23 @@ while 1:
with self.assertRaises(SyntaxError):
compile(source, "<string>", "exec")
def test_except_stmt_invalid_as_expr(self):
self._check_error(
textwrap.dedent(
"""
try:
pass
except ValueError as obj.attr:
pass
"""
),
errtext="cannot use except statement with attribute",
lineno=4,
end_lineno=4,
offset=22,
end_offset=22 + len("obj.attr"),
)
def load_tests(loader, tests, pattern):
tests.addTest(doctest.DocTestSuite())