Módulo 9 - Erros e exceções: nível avançado

Os blocos else e finally

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Usar o bloco else do try para o código que só roda sem erro.
  • Entender que o finally executa sempre, com ou sem exceção.
  • Separar o que é tentativa arriscada do que é continuação normal.
  • Aplicar o finally para liberar recursos com segurança.

O que else e finally fazem

O try completo do Python tem até quatro partes: o try em si, um ou mais except, um else opcional e um finally opcional. Você já domina o try e o except. As duas peças novas resolvem dúvidas práticas. A primeira: onde colocar o código que só deve rodar se nada deu errado? A resposta é o else. A segunda: onde colocar o código que precisa rodar de qualquer jeito, tenha dado erro ou não? A resposta é o finally. Cada bloco tem um momento certo de execução, e conhecer esses momentos deixa o seu tratamento de erros muito mais limpo.

try:
    idade = int("30")
except ValueError:
    print("Idade inválida.")
else:
    print("Conversão deu certo, idade é", idade)
finally:
    print("Fim da tentativa.")

# Saída:
# Conversão deu certo, idade é 30
# Fim da tentativa.

Sem erro: o except é pulado, o else roda e o finally roda no fim.

Repare na ordem da saída. Como a conversão deu certo, o except foi ignorado, o else foi executado e, por último, o finally. Agora imagine que o texto fosse "trinta": o int() levantaria ValueError, o except imprimiria a mensagem de idade inválida, o else seria pulado por ter havido erro, e o finally rodaria mesmo assim. Essa é a essência: o else é o caminho do sucesso, o finally é o caminho de todo mundo.

Por que separar em else e finally

Poderíamos jogar tudo dentro do try e viver sem else. Por que não fazer isso? Porque o try deve conter apenas o trecho que pode dar errado. Se você empurra para dentro do try também o passo seguinte, que não falha, corre o risco de um except capturar um erro que veio desse passo, e não da operação arriscada. O else evita essa confusão: no try fica só a tentativa; no else fica a continuação que depende do sucesso. Fica claro para quem lê o que é frágil e o que é rotina.

def ler_config(caminho):
    arquivo = open(caminho, encoding="utf-8")
    try:
        dados = arquivo.read()
        return len(dados)
    finally:
        arquivo.close()
        print("Arquivo fechado.")

# Se a leitura falhar, o finally ainda fecha o arquivo antes de propagar o erro.

O finally garante que o arquivo é fechado mesmo se a leitura levantar uma exceção.

O finally brilha quando você precisa liberar um recurso: um arquivo aberto, uma conexão de rede, uma trava. Sem ele, um erro no meio do caminho poderia deixar o arquivo aberto para sempre. Com o finally, o fechamento acontece aconteça o que acontecer, inclusive quando o try devolve um valor com return. Na prática do Python moderno, o comando with faz esse trabalho de forma ainda mais elegante para arquivos, mas entender o finally é o que explica por que o with é seguro por baixo dos panos.

Fixando else e finally

Guarde a diferença com uma frase: o else é para o sucesso, o finally é para sempre. O else só roda quando o try passou limpo, ideal para o próximo passo que depende disso. O finally roda em qualquer cenário, ideal para a limpeza que não pode ser esquecida. Juntos, else e finally deixam claro no código o que é caminho feliz, o que é reação a erro e o que é obrigação de encerramento. Na próxima aula, você inverte o jogo: em vez de reagir a erros dos outros, você aprende a levantar os seus com raise.

Teste rápido

Em quais situações o bloco finally é executado?

Perguntas frequentes

O else do try é o mesmo else do if?
A palavra é a mesma, mas o sentido muda. No if, o else roda quando a condição é falsa. No try, o else roda quando nenhuma exceção foi levantada, ou seja, quando a tentativa deu certo. São contextos diferentes que reaproveitam a mesma palavra-chave.
Posso ter finally sem except?
Pode. Um try com apenas finally é válido e útil: você não trata o erro ali, mas garante a limpeza antes que a exceção suba. O erro continua se propagando para quem chamou, e o finally roda no caminho de saída de qualquer forma.
Preciso sempre usar else e finally?
Não. Muitos try funcionam bem só com except. Use o else quando quiser separar o passo de sucesso da parte arriscada, e o finally quando houver um recurso a liberar. Adicionar esses blocos sem necessidade só polui o código.
O que roda primeiro, o else ou o finally?
O else roda antes do finally. Quando o try passa sem erro, o Python executa o else e, em seguida, o finally, que é sempre o último a rodar. Se houver erro, o else é pulado e o finally roda mesmo assim.
O finally roda mesmo se houver um return no try?
Sim. Essa é uma das razões de existir. Mesmo que o try devolva um valor com return, o Python executa o finally antes de a função realmente sair. É o que garante que o arquivo seja fechado antes do retorno.
Então o comando with substitui o finally?
Para arquivos e outros recursos que suportam o padrão de contexto, o with é mais elegante e faz o fechamento automático. Por baixo, ele usa a mesma ideia do finally. Entender o finally ajuda a confiar no with e a saber quando cada um cabe.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.