# SPDX-License-Identifier: MIT
# Exception outcomes and cleanup order, independent of traceback formatting.
def divide(a, b):
    return a // b

for divisor in [3, 0, -3]:
    try:
        print(divide(7, divisor))
    except ZeroDivisionError as error:
        print(type(error).__name__, str(error))
    else:
        print("ok")
    finally:
        print("cleanup")

try:
    values = [2, 4]
    print(10 + values[5])
except (ValueError, LookupError) as error:
    print(type(error).__name__, str(error))

try:
    try:
        raise ValueError("original")
    except ValueError as error:
        print(repr(error))
        raise
    finally:
        print("inner final")
except Exception as error:
    print(type(error).__name__, str(error))

def finish():
    try:
        return 7
    finally:
        print("return final")

print(finish())

def override():
    try:
        return 1
    finally:
        return 2

print(override())
for i in range(3):
    try:
        if i == 0:
            continue
        break
    finally:
        print("loop final", i)

try:
    assert False, "expected"
except AssertionError as error:
    print(type(error).__name__, str(error))

try:
    raise RuntimeError
except RuntimeError as error:
    print(repr(error), bool(error))
try:
    try:
        print("body")
    except ValueError:
        print("wrong handler")
    else:
        raise KeyError("missing")
    finally:
        print("else final")
except LookupError as error:
    print(type(error).__name__, str(error))

try:
    try:
        raise ValueError("before")
    finally:
        raise TypeError("replacement")
except Exception as error:
    print(type(error).__name__, str(error))

def caught_return():
    try:
        try:
            return 8
        finally:
            raise ValueError("from final")
    except ValueError:
        return 9

print(caught_return())
try:
    for j in range(2):
        break
    print("after nested loop")
finally:
    print("outer loop final")
