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:
-
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.") -
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.") -
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.") -
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}") -
Uso de
else: Executa-se se não houver exceções emtry.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}") -
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.") -
raisepara 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}") -
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 -
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.