Sobes.tech
Junior

Quais são as características do tratamento de exceções em Python?

sobes.tech IA

Resposta da IA

As exceções em Python são eventos que interrompem o fluxo normal de execução do programa. São objetos que representam erros.

Características:

  • Hierarquia de exceções: Todas as exceções integradas são classes e estão organizadas numa hierarquia baseada na herança da classe base BaseException.
    # Exemplo de hierarquia
    # BaseException -> Exception -> StandardError -> ...
    #                  Exception -> ArithmeticError -> ZeroDivisionError
    
  • Blocos try...except...: Mecanismo principal de tratamento de exceções.
    try:
        # Código que pode gerar uma exceção
        result = 10 / 0
    except ZeroDivisionError:
        # Tratamento de uma exceção específica
        print("Divisão por zero!")
    except Exception as e:
        # Tratamento de outras exceções
        print(f"Ocorreu um erro: {e}")
    
  • Múltiplos blocos except: Permitem tratar diferentes tipos de exceções de forma distinta.
    try:
        # Código
        value = int("abc")
    except ValueError:
        print("Formato de número inválido.")
    except TypeError:
        print("Tipo de dado inválido.")
    
  • Bloco else: Executa-se se o bloco try terminar sem exceções.
    try:
        # Código
        result = 10 / 2
    except ZeroDivisionError:
        print("Divisão por zero!")
    else:
        print("Operação bem-sucedida.")
    
  • Bloco finally: Executa-se sempre, independentemente de ter ocorrido uma exceção ou não. É usado para libertar recursos.
    file = None
    try:
        file = open("myfile.txt", "r")
        # Leitura do arquivo
    except FileNotFoundError:
        print("Ficheiro não encontrado.")
    finally:
        if file:
            file.close() # Fecho garantido do ficheiro
    
  • Operador raise: Usado para lançar explicitamente uma exceção.
    def divide(a, b):
        if b == 0:
            raise ZeroDivisionError("Não é possível dividir por zero")
        return a / b
    
    try:
        divide(10, 0)
    except ZeroDivisionError as e:
        print(f"Erro: {e}")
    
  • Exceções personalizadas: Pode criar classes de exceção próprias herdando de Exception ou de outra classe de exceção existente.
    class CustomError(Exception):
        pass
    
    def process_data(data):
        if not data:
            raise CustomError("Dados vazios")
    
    try:
        process_data([])
    except CustomError as e:
        print(f"Erro: {e}")
    
  • Tratamento de exceções usando o gestor de contexto with: Simplifica o trabalho com recursos que requerem fecho explícito (como ficheiros).
    try:
        with open("myfile.txt", "r") as file:
            # Trabalhar com o ficheiro
            content = file.read()
    except FileNotFoundError:
        print("Ficheiro não encontrado.")
    # O ficheiro fecha-se automaticamente ao sair do bloco 'with'
    
  • Encadeamento de exceções: Ao tratar uma exceção, pode guardar informações sobre a exceção anterior (implicitamente ou usando raise Exception from another_exception).

Estas características proporcionam um mecanismo flexível e poderoso para lidar com erros em Python, permitindo criar programas mais robustos e resistentes a falhas.