Skip to content

jump-statement-in-finally (B012)

Derived from the flake8-bugbear linter.

What it does

Checks for break, continue, and return statements in finally blocks.

Why is this bad?

The use of break, continue, and return statements in finally blocks can cause exceptions to be silenced.

finally blocks execute regardless of whether an exception is raised. If a break, continue, or return statement is reached in a finally block, any exception raised in the try or except blocks will be silenced.

Example

def speed(distance, time):
    try:
        return distance / time
    except ZeroDivisionError:
        raise ValueError("Time cannot be zero")
    finally:
        return 299792458  # `ValueError` is silenced

Use instead:

def speed(distance, time):
    try:
        return distance / time
    except ZeroDivisionError:
        raise ValueError("Time cannot be zero")

References