Como lidar com exceções em Python (Try-Except-Finally)

Aprenda como lidar com exceções em Python usando blocos try, exceto, else e finalmente. Escreva código Python livre de erros e resistente a falhas.

Experimente esta solução no Editor

Visão geral

Um software robusto deve estar preparado para lidar com condições inesperadas, como arquivos ausentes, entradas de usuário inválidas, falhas de banco de dados ou interrupções de rede. Quando ocorre um erro em Python, ele gera uma exceção. Se não forem tratadas, as exceções interromperão seu programa imediatamente e imprimirão uma pilha de rastreamento.

A principal ferramenta do Python para gerenciar erros de tempo de execução é o bloco `try-except`. Você coloca o código que pode gerar um erro dentro do bloco `try` e define o código de tratamento de erros dentro de um ou mais blocos `except`. Especificar a classe de exceção exata (como `ValueError` ou `ZeroDivisionError`) é altamente recomendado, pois capturar todas as exceções genéricas (`exceto:`) pode mascarar bugs.

Para tornar seu fluxo de exceções mais expressivo, Python fornece dois blocos adicionais: `else` e `finally`. O bloco `else` é executado somente se nenhuma exceção for levantada no bloco `try`, o que é útil para código que só deve ser executado com sucesso. O bloco `finally` é executado *sempre*, independentemente de ter ocorrido uma exceção, tornando-o o local perfeito para limpezas como fechamento de arquivos ou conexões de banco de dados.

Saída de código e execução

Este script demonstra o tratamento robusto de erros em Python usando try, exceto, else e finalmente.

handle_errors.py
Experimente no Editor
def divide_numbers(a, b):
    try:
        # Code that might raise an exception
        result = a / b
    except ZeroDivisionError:
        # Handling a specific exception
        print("Error: Cannot divide by zero!")
    except TypeError:
        # Handling another exception type
        print("Error: Inputs must be numbers!")
    else:
        # Run only if try block succeeded
        print(f"Success! Result of {a}/{b} is {result}")
    finally:
        # Runs no matter what
        print("Division attempt completed.")

divide_numbers(10, 2)
print("---")
divide_numbers(10, 0)
Saída terminal
Success! Result of 10/2 is 5.0
Division attempt completed.
---
Error: Cannot divide by zero!
Division attempt completed.

Implementação passo a passo

  • Coloque o código que pode falhar dentro de um bloco try.
  • Capture tipos de erros específicos com blocos except ExceptionType: para lidar com falhas normalmente.
  • Use else para código que deve ser executado somente em blocos try bem-sucedidos.
  • Utilize finalmente para garantir que as ações de limpeza sejam executadas independentemente de erros.

Perguntas frequentes

Posso capturar várias exceções em um único bloco except?

Sim, você pode passá-los como uma tupla: exceto (ValueError, TypeError) as e:.

Como faço para levantar minhas próprias exceções?

Use a palavra-chave raise seguida pela instância de exceção: raise ValueError("Valor de configuração inválido").

Tópicos Relacionados

Recursos Python recomendados

Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.