Na tua próxima tarefa na PyTalento, foste encarregado de lidar com possíveis erros que podem surgir durante a execução de um programa. Nem sempre os utilizadores introduzem os dados corretos, ou o sistema pode encontrar problemas como ficheiros em falta ou valores inesperados. Python oferece uma forma poderosa de lidar com esses problemas: a manipulação de exceções. Neste capítulo, vais aprender a usar blocos try, except, e finally para capturar e tratar erros de forma eficiente.
Objetivos
- Compreender como funcionam as exceções em Python.
- Aprender a usar os blocos
try,exceptefinally. - Explorar como capturar e tratar diferentes tipos de exceções.
O que são Exceções?
Uma exceção é um erro que ocorre durante a execução de um programa. Se uma exceção não for tratada, o programa falha e pára de funcionar. Em vez de deixar que o programa falhe, podemos capturar a exceção e tratá-la de forma a permitir que o programa continue a correr ou, pelo menos, encerre de forma controlada.
Exemplo de uma Exceção:
# Exemplo de exceção: divisão por zero
a = 10
b = 0
resultado = a / b # Isto gera um erro (ZeroDivisionError)
O exemplo acima gera uma exceção de divisão por zero (ZeroDivisionError), o que faz o programa parar com uma mensagem de erro. Para evitar isso, podemos usar blocos try e except para capturar e tratar este erro.
Usar try e except
O bloco try permite-nos testar um bloco de código que pode gerar uma exceção. Se a exceção ocorrer, o código dentro do bloco except é executado. Isto permite que o programa trate o erro de forma controlada, em vez de falhar.
Exemplo de Uso de try e except:
# Exemplo de manipulação de exceção com try e except
a = 10
b = 0
try:
resultado = a / b
except ZeroDivisionError:
print("Erro: Não é possível dividir por zero.")
Neste exemplo, o bloco try tenta executar a divisão, mas se ocorrer uma exceção de divisão por zero (ZeroDivisionError), o código dentro do bloco except é executado, imprimindo uma mensagem de erro em vez de deixar o programa falhar.
Tratar Múltiplas Exceções
Podes capturar diferentes tipos de exceções, criando blocos except para cada tipo de erro específico. Por exemplo, podes querer tratar um erro de valor inválido (ValueError) separadamente de um erro de divisão por zero.
Exemplo de Múltiplas Exceções:
# Exemplo de múltiplas exceções
a = 10
b = input("Introduz um número: ")
try:
b = int(b) # Pode gerar um ValueError se a entrada não for um número
resultado = a / b # Pode gerar um ZeroDivisionError se b for 0
except ValueError:
print("Erro: Entrada inválida. Por favor, introduz um número.")
except ZeroDivisionError:
print("Erro: Não é possível dividir por zero.")
Aqui, estamos a capturar dois tipos de exceções: se o utilizador introduzir algo que não pode ser convertido para um número, o bloco except ValueError é executado; se o utilizador introduzir 0, o bloco except ZeroDivisionError é executado.
Usar finally para Limpeza
O bloco finally é sempre executado, independentemente de uma exceção ter ocorrido ou não. É útil quando precisas de garantir que uma determinada ação (como fechar um ficheiro) ocorre, independentemente do sucesso ou falha do bloco try.
Exemplo de finally:
# Exemplo de uso de try, except e finally
try:
ficheiro = open("dados.txt", "r")
conteudo = ficheiro.read()
except FileNotFoundError:
print("Erro: O ficheiro não foi encontrado.")
finally:
ficheiro.close() # Fechar o ficheiro, mesmo que ocorra um erro
Mesmo que o ficheiro não seja encontrado e uma exceção seja lançada, o bloco finally assegura que o ficheiro é fechado corretamente.
Lançar Exceções Personalizadas
Podes também lançar exceções de forma manual usando a instrução raise. Isto pode ser útil quando queres criar os teus próprios erros em certas situações específicas.
Exemplo de Exceção Personalizada:
# Lançar uma exceção personalizada
def verificar_idade(idade):
if idade < 18:
raise ValueError("Idade inválida: o utilizador deve ter pelo menos 18 anos.")
try:
idade = int(input("Introduz a tua idade: "))
verificar_idade(idade)
except ValueError as e:
print("Erro:", e)
Neste exemplo, lançamos uma exceção ValueError personalizada se a idade for inferior a 18 anos, e tratamos essa exceção no bloco except.
Exercício Prático
A empresa PyTalento pediu-te que desenvolvas um programa que peça ao utilizador para introduzir dois números e que divida o primeiro pelo segundo. O programa deve tratar os seguintes erros:
- ValueError: Ocorre se o utilizador introduzir algo que não seja um número.
- ZeroDivisionError: Ocorre se o segundo número for zero.
- FileNotFoundError: Simula a leitura de um ficheiro inexistente.
Exemplo de Código:
# Exemplo de tratamento de exceções
try:
a = int(input("Introduz o primeiro número: "))
b = int(input("Introduz o segundo número: "))
# Simular leitura de ficheiro (apenas para fins de erro)
ficheiro = open("ficheiro_inexistente.txt", "r")
resultado = a / b
print("O resultado é:", resultado)
except ValueError:
print("Erro: Por favor, introduz números válidos.")
except ZeroDivisionError:
print("Erro: Não é possível dividir por zero.")
except FileNotFoundError:
print("Erro: O ficheiro não foi encontrado.")
finally:
print("Operação concluída.")