75 lines
1.8 KiB
Plaintext
75 lines
1.8 KiB
Plaintext
== Why is this an issue?
|
|
|
|
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.
|
|
|
|
|
|
This rule raises an issue when a bare ``++raise++`` statements is in a ``++finally++`` block.
|
|
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,python]
|
|
----
|
|
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
|
|
|
|
[source,python]
|
|
----
|
|
def foo(param):
|
|
result = 0
|
|
try:
|
|
print("foo")
|
|
except ValueError as e:
|
|
pass
|
|
else:
|
|
if param:
|
|
raise ValueError()
|
|
finally:
|
|
if not param:
|
|
result = 1
|
|
# the exception will raise automatically
|
|
return result
|
|
----
|
|
|
|
|
|
== Resources
|
|
|
|
* Python Documentation - https://docs.python.org/3/reference/simple_stmts.html#raise[The ``++raise++`` statement]
|
|
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
include::message.adoc[]
|
|
|
|
include::highlighting.adoc[]
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::comments-and-links.adoc[]
|
|
endif::env-github,rspecator-view[]
|