diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index a88cc6d3442bf0b7c847c88ba1e2eff3dc15b4e1..f83da400a9bd5b6fc11baf4e1f0e0c53ff4f6af7 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -6093,14 +6093,10 @@ class ExceptClauseNode(Node): if (not getattr(self.body, 'stats', True) and self.excinfo_target is None - and (self.target is None or self.is_except_as)): + and self.target is None): # most simple case: no exception variable, empty body (pass) # => reset the exception state, done code.putln("PyErr_Restore(0,0,0);") - if self.is_except_as and self.target: - # "except ... as x" deletes x after use - # target is known to be a NameNode - self.target.generate_deletion_code(code) code.put_goto(end_label) code.putln("}") return diff --git a/tests/run/tryexcept.pyx b/tests/run/tryexcept.pyx index 85330b3abcbba04ad404b4d99ec7bc0793a6e7bb..2302ffb8b8c76efcd0adc963db3fee8d9432136c 100644 --- a/tests/run/tryexcept.pyx +++ b/tests/run/tryexcept.pyx @@ -384,6 +384,22 @@ def except_as_raise_deletes_target(x, a): print(b) # raises UnboundLocalError if except clause was executed return i +def except_as_raise_with_empty_except(x, a): + """ + >>> except_as_raise_with_empty_except(None, TypeError) + >>> except_as_raise_with_empty_except(TypeError('test'), TypeError) + >>> except_as_raise_with_empty_except(ValueError('test'), TypeError) + Traceback (most recent call last): + ValueError: test + >>> except_as_raise_with_empty_except(None, TypeError) + """ + try: + if x: + raise x + b = 1 + except a as b: # previously raised UnboundLocalError + pass + def except_as_deletes_target_in_gen(x, a): """ >>> list(except_as_deletes_target_in_gen(None, TypeError))