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