Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Entendendo uma execução com as cláusulas try, except e finally

def fancy_divide(numbers, index):
    try:
        denom = numbers[index]
        for i in range(len(numbers)):
            numbers[i] /= denom
    except IndexError:
        fancy_divide(numbers, len(numbers) - 1)
    except ZeroDivisionError:
        print("-2")
    else:
        print("1")
    finally:
        print("0")


fancy_divide([0, 2, 4], 4)

A saída do código acima é 1 0 0

Eu não entendi porque o finally foi executado duas vezes, embora quando ocorre o IndexError há uma chamada recursiva de fancy_divide([0, 2, 4], 2)...

1 resposta
solução!

Oi, Edson! É justamente isso que você falou, por causa dessa chamada recursiva da função. O finally vai sempre ser executado no final do bloco try-except, então o que acontece é que o código do finally está sendo executado duas vezes, porque o código do bloco todo está sendo executado duas vezes!

A função começa a ser executada (vamos chamar de execução 1) e dá IndexError, que é pego pelo except. O except começa a execução 2 dessa função, que não é pega por nenhum except, então passa pelo else e, finalmente, pelo finally, imprimindo o 0. A execução 2 finaliza aí. Então, retomando da execução 1, o finally é executado e o 0 é impresso de novo.

Espero que tenha ficado claro. Abraços!