Sobes.tech
Junior

Como tratar exceções corretamente em Python de várias maneiras?

sobes.tech IA

Resposta da IA

As exceções são tratadas usando blocos try, except, else, finally.

Principais tipos de tratamento:

  1. Captura básica: Captura qualquer exceção.

    try:
        # Código que pode gerar uma exceção
        result = 10 / 0
    except:
        # Tratamento de qualquer exceção
        print("Ocorreu um erro.")
    
  2. Captura de uma exceção específica: Captura um tipo concreto de exceção.

    try:
        # Código que pode gerar uma exceção
        result = 10 / 0
    except ZeroDivisionError:
        # Tratamento de divisão por zero
        print("Erro: Divisão por zero.")
    
  3. Captura de múltiplas exceções: Captura vários tipos de exceções.

    try:
        # Código que pode gerar uma exceção
        data = [1, 2, 3]
        print(data[5])
        result = 10 / 0
    except (IndexError, ZeroDivisionError):
        # Tratamento de erros de índice ou divisão por zero
        print("Ocorreu um erro de índice ou divisão por zero.")
    
  4. Captura de exceção com acesso ao objeto de exceção: Permite acessar as informações do erro.

    try:
        # Código que pode gerar uma exceção
        result = int("abc")
    except ValueError as e:
        # Tratamento do erro de conversão, e contém a informação
        print(f"Erro de valor: {e}")
    
  5. Uso de else: Executa-se se não houver exceções em try.

    try:
        # Código sem erros
        result = 10 / 2
    except ZeroDivisionError:
        print("Erro: Divisão por zero.")
    else:
        # Executa se não houver erros
        print(f"Resultado: {result}")
    
  6. Uso de finally: Executa-se sempre, independentemente de exceções.

    file = None
    try:
        file = open("myfile.txt", "r")
        # Leitura do arquivo ou outras operações
    except FileNotFoundError:
        print("Arquivo não encontrado.")
    finally:
        # Fechamento garantido do arquivo se foi aberto
        if file:
            file.close()
            print("Arquivo fechado.")
    
  7. raise para lançar exceções: Usado para gerar exceções.

    def divide(a, b):
        if b == 0:
            # Lançar exceção
            raise ZeroDivisionError("Não é possível dividir por zero!")
        return a / b
    
    try:
        print(divide(10, 0))
    except ZeroDivisionError as e:
        print(f"Exceção capturada: {e}")
    
  8. raise ... from ... para ligar exceções: Permite associar uma nova exceção à anterior.

    try:
        result = 1 / 0
    except ZeroDivisionError as e:
        # Lançar uma nova exceção relacionada à anterior
        raise RuntimeError("Ocorreu um erro interno") from e
    
  9. Uso do gerenciador de contexto with open(...): Garante o fechamento correto do recurso (ex. arquivo).

    try:
        with open("myfile.txt", "r") as file:
            content = file.read()
            print(content)
        # O arquivo será fechado automaticamente ao sair do bloco with
    except FileNotFoundError:
        print("Arquivo não encontrado.")
    

Resumo dos blocos de tratamento de exceções:

Bloco Descrição Quando é executado
try Bloco de código onde podem ocorrer exceções Sempre
except Tratamento de exceções ocorridas em try Se ocorreu uma exceção
else Executa se não houve exceções em try Se não há exceções
finally Executa sempre, independentemente de exceções Sempre

A escolha do método depende da situação concreta e do nível de detalhe desejado na gestão de erros. É importante capturar apenas as exceções que podem ser geridas corretamente, evitando capturas demasiado amplas (except:) sem necessidade.