A bare raise statement, i.e. a raise with no exception provided, will re-raise the last active exception in the current
scope. If no exception is active a RuntimeError is raised instead.
If the bare "raise" statement is in a finally block, it will only have an active exception to re-raise when an exception from the
try block is not caught or when an exception is raised by an except or else block. Thus bare raise
statements should not be relied upon in finally blocks. It is simpler to let the exception raise automatically.
Code examples
Noncompliant code example
def foo(param):
result = 0
try:
print("foo")
except ValueError as e:
pass
else:
if param:
raise ValueError()
finally:
if param:
raise # Noncompliant: This will fail in some context.
else:
result = 1
return result
Compliant solution
def foo(param):
result = 0
try:
print("foo")
except ValueError as e:
pass
else:
if param:
raise ValueError()
finally:
if not param:
result = 1
return result