The purpose of a `finally` block is to ensure the cleanup of objects (e.g. closing the file), it is executed after `try` and `catch` blocks under any circumstances. Having a `return` or a thrown exception in a ``++finally++`` block suppresses the propagation of any unhandled exception which was thrown in the ``++try++`` or ``++catch++`` block or overwrite the returned value.

This rule will report on all usages of jump statements (``++return++``, ``++break++``, ``++throw++``, and ``++continue++``) from a ``++finally++`` block. Even if it's guaranteed that no unhandled exception can happen in ``++try++`` or ``++catch++`` blocks, it's not recommended to use any jump statements inside the `finally` to have the logic there limited to the "cleanup".

== Noncompliant Code Example

[source,javascript]
----
async function foo() {
    let result, connection;
    try {
        connection = await connect();
        result = connection.send(1);
    } catch(err) {
        console.error(err.message); // if this line throws, this exception will not be propagated
    } finally {
        connection.close();
        return result;              // Noncompliant
    }
}
----


== Compliant Solution

[source,javascript]
----
async function foo() {
    let result, connection;
    try {
        connection = await connect();
        result = connection.send(1);
    } catch(err) {
        console.error(err.message);
    } finally {
        connection.close();
    }
    return result;
}
----

include::../see.adoc[]

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

'''
== Implementation Specification
(visible only on this page)

include::../message.adoc[]

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

include::../comments-and-links.adoc[]
endif::env-github,rspecator-view[]
