== 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)

=== Message

Refactor this code so that any active exception raises naturally


=== Highlighting

Primary:

* The bare "raise" statement

Secondary:

* the parent "finally:" statement


'''
== Comments And Links
(visible only on this page)

=== is related to: S5747

=== on 29 Jan 2020, 13:56:33 Nicolas Harraudeau wrote:
This rule is similar to RSPEC-1163 but the problem is a little different. It is perfectly ok to raise an exception in a ``++finally++`` block in python. Python will automatically link the new exception to any exception raised in the ``++try++`` block. However a bare ``++raise++`` is problematic as it can fail.

endif::env-github,rspecator-view[]
