Dominando Tratamento de Exceções em Python: try, except, else e finally Explicados
Dominando Tratamento de Exceções em Python: try, except, else e finally Explicados
Este guia percorre os construtos de tratamento de exceções do Python com snippets práticos de código e dicas de boas práticas.
Vídeo: Tratamento de Exceções em Python (try..except..finally)
Exceções em Python
Python levanta exceções built-in sempre que erro de runtime ocorre. O interpretador interrompe bloco de código atual e propaga exceção pela call stack até encontrar handler. Se nenhum handler existe, programa termina e imprime traceback.
Considere cadeia de chamadas: A chama B, que chama C. Se C levanta exceção não tratada localmente, ela borbulha para B e depois A. Exceções não tratadas resultam em crash abrupto do programa.
Capturando Exceções em Python
Para interceptar exceção, coloque código potencialmente inseguro dentro de bloco try. Cláusula except contém lógica que executa quando exceção ocorre.
Exemplo conciso demonstrando o fluxo:
# Importar módulo sys para inspecionar tipo de exceção
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("The entry is", entry)
r = 1 / int(entry)
break
except:
print("Oops!", sys.exc_info()[0], "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
Saída
The entry is a Oops! <class 'ValueError'> occurred. Next entry. The entry is 0 Oops! <class 'ZeroDivisionError'> occurred. Next entry. The entry is 2 The reciprocal of 2 is 0.5
O código itera sobre random_list. Se conversão para int ou divisão falhar, bloco except trata erro, loga e passa para próximo item. Quando conversão bem-sucedida ocorre, loop quebra e recíproco é impresso.
Como todas exceções built-in herdam de Exception, você pode capturá-las genericamente:
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("The entry is", entry)
r = 1 / int(entry)
break
except Exception as e:
print("Oops!", e.__class__, "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
Saída idêntica, mas handler agora referencia classe de exceção específica via e.__class__.
Capturando Exceções Específicas em Python
Capturar todas exceções amplamente pode mascarar bugs e dificultar debug. Em vez disso, liste apenas tipos de exceção que espera.
Bloco try pode conter múltiplas cláusulas except; apenas a primeira correspondente executa. Exemplo:
try:
# código que pode levantar erro
pass
except ValueError:
# tratar ValueError
pass
except (TypeError, ZeroDivisionError):
# tratar TypeError ou ZeroDivisionError
pass
except Exception:
# fallback para qualquer outra exceção
pass
Levantando Exceções em Python
Além de exceções automáticas, desenvolvedores podem levantar erros explicitamente usando statement raise. Opcionalmente, passe mensagem para clarificar razão.
raise KeyboardInterrupt
# Traceback: KeyboardInterrupt
raise MemoryError("This is an argument")
# Traceback: MemoryError: This is an argument
try:
a = int(input("Enter a positive integer: "))
if a <= 0:
raise ValueError("That is not a positive number!")
except ValueError as ve:
print(ve)
Cláusula else do try em Python
Cláusula else opcional executa apenas quando bloco try completa sem levantar exceção. Esse padrão mantém código de caminho de sucesso separado de tratamento de erro.
Exemplo: imprimir recíproco de número par.
# programa para imprimir recíproco de números pares
try:
num = int(input("Enter a number: "))
assert num % 2 == 0
except:
print("Not an even number!")
else:
reciprocal = 1 / num
print(reciprocal)
Saída ao digitar número ímpar:
Enter a number: 1 Not an even number!
Saída ao digitar número par:
Enter a number: 4 0.25
Note que se num for zero, ZeroDivisionError é levantado no bloco else e não capturado pelo except anterior.
Python try…finally
Cláusula finally garante que código de limpeza execute independentemente de exceção ocorrer. Essencial ao trabalhar com recursos externos como arquivos, conexões de rede ou GUIs.
Uso típico com manipulação de arquivo:
try:
f = open("test.txt", encoding='utf-8')
# realizar operações de arquivo
finally:
f.close()
Arquivo sempre fechado, mesmo se erro surgir durante processamento.
python
- Palavras-chave e Identificadores em Python: Dominando Palavras Reservadas e Convenções de Nomenclatura
- Declarações, Indentação e Comentários em Python: Guia Claro
- Variáveis, Constantes e Literais em Python – Guia Completo
- Dominando Conversão e Casting de Tipos em Python: Guia Completo
- Dominando I/O e Importação de Módulos em Python: Guia Prático
- Dominando a Declaração Pass em Python: Guia Prático
- Entendendo Variáveis Globais, Locais e Nonlocal em Python
- Dominando Operações com Diretórios e Arquivos em Python
- Dominando Tratamento de Exceções em Python: try, except, else e finally Explicados
- Construa um Sensor de Temperatura Remoto com Raspberry Pi e Python – Guia Passo a Passo