O tratamento de exceções é um componente crítico para a programação robusta em Python. Ele permite que você gerencie erros que possam surgir durante a execução do programa de forma elegante, prevenindo travamentos e fornecendo aos usuários feedback informativo. Este tutorial aborda os conceitos fundamentais do tratamento de exceções em Python.
Sumário
1. try…except
O bloco try...except
é a base do tratamento de exceções. O código que pode gerar uma exceção é colocado dentro do bloco try
. Se uma exceção ocorrer, o bloco except
correspondente é executado.
try:
result = 10 / 0 # Isso gerará um ZeroDivisionError
except ZeroDivisionError:
print("Erro: Divisão por zero!")
except TypeError:
print("Erro: Tipo de dado incompatível")
except Exception as e: # Captura qualquer outra exceção
print(f"Ocorreu um erro inesperado: {e}")
else: # Bloco else opcional, executa se nenhuma exceção ocorrer
print(f"Resultado: {result}")
finally: # Bloco finally opcional, sempre executa
print("Isso sempre executa.")
Este exemplo demonstra o tratamento de um ZeroDivisionError
. Múltiplos blocos except
podem lidar com diferentes tipos de exceções. O bloco else
opcional é executado apenas se nenhuma exceção ocorrer no bloco try
. O bloco finally
, também opcional, sempre executa, ideal para tarefas de limpeza, como fechar arquivos.
2. raise Exception
A instrução raise
permite que você gere exceções explicitamente, sinalizando erros ou condições excepcionais.
def validar_idade(idade):
if idade < 0:
raise ValueError("Idade não pode ser negativa")
elif idade > 120:
raise ValueError("Idade irrealisticamente alta")
return idade
try:
idade = validar_idade(-5)
print(f"Idade válida: {idade}")
except ValueError as e:
print(f"Erro: {e}")
Aqui, validar_idade
gera um ValueError
se a idade for inválida. Você pode gerar qualquer exceção integrada ou criar suas próprias (classes que herdam de Exception
).
3. try…finally
O bloco finally
garante que o código dentro dele sempre seja executado, independentemente de exceções. É essencial para limpeza.
arquivo = None
try:
arquivo = open("meu_arquivo.txt", "r")
conteudo = arquivo.read()
print(conteudo)
except FileNotFoundError:
print("Arquivo não encontrado!")
finally:
if arquivo:
arquivo.close()
print("Arquivo fechado.")
Isso garante que o arquivo seja fechado mesmo que um FileNotFoundError
ocorra, prevenindo vazamentos de recursos.
4. Exceções Integradas Comuns
Python oferece diversas exceções integradas:
ZeroDivisionError
: Divisão por zero.TypeError
: Tipo inadequado para uma operação.ValueError
: Tipo correto, valor inadequado.FileNotFoundError
: Arquivo não encontrado.IndexError
: Índice fora do intervalo.KeyError
: Chave não encontrada em um dicionário.ImportError
: Falha na importação.NameError
: Nome não encontrado.
5. Criando Exceções Personalizadas
Para um tratamento de erros mais específico, crie exceções personalizadas herdando da classe Exception
:
class ErroEntradaInvalida(Exception):
pass
def processar_dados(dados):
if not dados:
raise ErroEntradaInvalida("Dados não podem estar vazios")
# ...resto do processamento dos dados...
try:
processar_dados("")
except ErroEntradaInvalida as e:
print(f"Erro Personalizado: {e}")
Isso permite um tratamento de erros mais granular e melhora a legibilidade do código.
O tratamento eficaz de exceções é vital para escrever programas Python robustos e confiáveis. Ao antecipar e tratar elegantemente erros potenciais, você constrói aplicativos mais resilientes e amigáveis ao usuário.