Skip to content

gh-99211: Point to except/except* on syntax errors when mixing them #99215

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions Grammar/python.gram
Original file line number Diff line number Diff line change
Expand Up @@ -1254,8 +1254,10 @@ invalid_try_stmt:
| a='try' ':' NEWLINE !INDENT {
RAISE_INDENTATION_ERROR("expected an indented block after 'try' statement on line %d", a->lineno) }
| 'try' ':' block !('except' | 'finally') { RAISE_SYNTAX_ERROR("expected 'except' or 'finally' block") }
| a='try' ':' block* ((except_block+ except_star_block) | (except_star_block+ except_block)) block* {
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot have both 'except' and 'except*' on the same 'try'") }
| 'try' ':' block* except_block+ a='except' b='*' expression ['as' NAME] ':' block* {
RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot have 'except*' in a 'try' statement with 'except'") }
| 'try' ':' block* except_star_block+ a='except' [expression ['as' NAME]] ':' block* {
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot have 'except' in a 'try' statement with 'except*'") }
invalid_except_stmt:
| 'except' '*'? a=expression ',' expressions ['as' NAME ] ':' {
RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized") }
Expand Down
16 changes: 8 additions & 8 deletions Lib/test/test_syntax.py
Original file line number Diff line number Diff line change
Expand Up @@ -1202,7 +1202,7 @@
... except* ValueError:
... pass
Traceback (most recent call last):
SyntaxError: cannot have both 'except' and 'except*' on the same 'try'
SyntaxError: cannot have 'except*' in a 'try' statement with 'except'

>>> try:
... pass
Expand All @@ -1211,7 +1211,7 @@
... except ValueError:
... pass
Traceback (most recent call last):
SyntaxError: cannot have both 'except' and 'except*' on the same 'try'
SyntaxError: cannot have 'except' in a 'try' statement with 'except*'

>>> try:
... pass
Expand All @@ -1222,7 +1222,7 @@
... except* ValueError:
... pass
Traceback (most recent call last):
SyntaxError: cannot have both 'except' and 'except*' on the same 'try'
SyntaxError: cannot have 'except*' in a 'try' statement with 'except'

>>> try:
... pass
Expand All @@ -1233,7 +1233,7 @@
... except ValueError:
... pass
Traceback (most recent call last):
SyntaxError: cannot have both 'except' and 'except*' on the same 'try'
SyntaxError: cannot have 'except' in a 'try' statement with 'except*'

Ensure that early = are not matched by the parser as invalid comparisons
>>> f(2, 4, x=34); 1 $ 2
Expand Down Expand Up @@ -2016,13 +2016,13 @@ def test_generator_in_function_call(self):

def test_except_then_except_star(self):
self._check_error("try: pass\nexcept ValueError: pass\nexcept* TypeError: pass",
r"cannot have both 'except' and 'except\*' on the same 'try'",
lineno=1, end_lineno=1, offset=1, end_offset=4)
r"cannot have 'except\*' in a 'try' statement with 'except'",
lineno=3, end_lineno=3, offset=1, end_offset=8)

def test_except_star_then_except(self):
self._check_error("try: pass\nexcept* ValueError: pass\nexcept TypeError: pass",
r"cannot have both 'except' and 'except\*' on the same 'try'",
lineno=1, end_lineno=1, offset=1, end_offset=4)
r"cannot have 'except' in a 'try' statement with 'except\*'",
lineno=3, end_lineno=3, offset=1, end_offset=7)

def test_empty_line_after_linecont(self):
# See issue-40847
Expand Down
Loading