diff --git a/parso/python/normalizer.py b/parso/python/normalizer.py index 6cb45e7..250133f 100644 --- a/parso/python/normalizer.py +++ b/parso/python/normalizer.py @@ -58,6 +58,16 @@ class ErrorFinder(Normalizer): else: self._add_syntax_error("invalid syntax", leaf) elif node.type in _BLOCK_STMTS: + if node.type == 'try_stmt': + default_except = None + for except_clause in node.children[3::3]: + if except_clause in ('else', 'finally'): + break + if except_clause == 'except': + default_except = except_clause + elif default_except is not None: + self._add_syntax_error("default 'except:' must be last", default_except) + with self._context.add_block(node): if len(self._context.blocks) == _MAX_BLOCK_SIZE: self._add_syntax_error("too many statically nested blocks", node) diff --git a/test/normalizer_issue_files/allowed_syntax.py b/test/normalizer_issue_files/allowed_syntax.py index 744b77e..ea43767 100644 --- a/test/normalizer_issue_files/allowed_syntax.py +++ b/test/normalizer_issue_files/allowed_syntax.py @@ -14,3 +14,19 @@ for x in [1]: for x in [1]: break continue + +try: + pass +except ZeroDivisionError: + pass + #: E722:0 +except: + pass + +try: + pass + #: E722:0 E901:0 +except: + pass +except ZeroDivisionError: + pass diff --git a/test/test_python_errors.py b/test/test_python_errors.py index 3e931fd..60fd344 100644 --- a/test/test_python_errors.py +++ b/test/test_python_errors.py @@ -70,6 +70,7 @@ def test_indentation_errors(code, positions): 'continue', 'break', 'return', + 'try: pass\nexcept: pass\nexcept X: pass', # IndentationError ' foo',