Abaixo, compartilho como estruturei as soluções da seção "Aplicando a projetos", sugestões de melhorias são bem vindas!
- Validação de Notas e Alternativas (Lançando Exceções Customizadas)
A grande sacada desse exercício é usar a palavra reservada raise. Em vez de apenas dar um print de erro, o raise força o programa a entender que uma regra de negócio foi violada e interrompe o fluxo imediatamente, repassando o erro para quem chamou a função.
def avalia_testes(testes, gabarito):
opcoes_validas = ['A', 'B', 'C', 'D']
notas_finais = []
for teste in testes:
nota_aluno = 0
for i in range(len(teste)):
# Se a resposta não for válida, lançamos a exceção e paramos o processo
if teste[i] not in opcoes_validas:
raise ValueError(f"A alternativa {teste[i]} não é uma opção de alternativa válida")
# Se for válida e bater com o gabarito, soma 1 ponto
if teste[i] == gabarito[i]:
nota_aluno += 1
notas_finais.append(nota_aluno)
return notas_finais
# --- Dados de Teste ---
gabarito = ['D', 'A', 'B', 'C', 'A']
testes_sem_ex = [['D', 'A', 'B', 'C', 'A'], ['C', 'A', 'A', 'C', 'A'], ['D', 'B', 'A', 'C', 'A']]
testes_com_ex = [['D', 'A', 'B', 'C', 'A'], ['C', 'A', 'A', 'E', 'A'], ['D', 'B', 'A', 'C', 'A']]
# Executando com Try/Except para capturar o erro de forma elegante
try:
print("Resultado da turma 1 (Sem Exceção):", avalia_testes(testes_sem_ex, gabarito))
print("Resultado da turma 2 (Com Exceção):", avalia_testes(testes_com_ex, gabarito))
except ValueError as e:
print(f"Erro detectado na validação: {e}")
- NLP e Higienização de Texto
Aqui, usamos o laço para iterar tanto pelas palavras quanto pelas pontuações. Assim que a primeira pontuação irregular é detectada, o raise ValueError entra em ação, paralisando a análise.
def verifica_pontuacao(lista_palavras):
pontuacoes = [',', '.', '!', '?']
for palavra in lista_palavras:
for p in pontuacoes:
if p in palavra:
raise ValueError(f'O texto apresenta pontuações na palavra "{palavra}".')
return "Texto validado com sucesso! Nenhuma pontuação encontrada."
# --- Dados de Teste ---
lista_tratada = ['Python', 'é', 'uma', 'linguagem', 'de', 'programação', 'poderosa', 'versátil']
lista_nao_tratada = ['Python', 'é', 'uma', 'linguagem', 'poderosa,', 'versátil!']
try:
print(verifica_pontuacao(lista_tratada))
print(verifica_pontuacao(lista_nao_tratada)) # Essa linha vai acionar a exceção
except ValueError as e:
print(f"Falha de Higienização NLP: {e}")
- Monitoramento da Cultura de Fungos (Múltiplas Exceções)
Esse é um cenário clássico: cruzar listas de dados (zip) sujeitas a inconsistências de tamanho e a cálculos impossíveis (divisão por zero). Agrupar múltiplos except permite que o programa dê uma mensagem específica para cada tipo de problema.
def divide_colunas(pressoes, temperaturas):
try:
# 1ª Validação: Tamanhos diferentes
if len(pressoes) != len(temperaturas):
raise ValueError("A quantidade de dados de pressão e temperatura é diferente.")
resultados = []
# 2ª Validação: O próprio Python lançará ZeroDivisionError se t == 0
for p, t in zip(pressoes, temperaturas):
razao = round(p / t, 2)
resultados.append(razao)
return resultados
except ValueError as ve:
print(f"Erro de Integridade dos Dados (ValueError): {ve}")
except ZeroDivisionError:
print("Erro de Cálculo (ZeroDivisionError): Tentativa de divisão por zero na temperatura.")
except Exception as e:
# Boa prática: capturar qualquer outro erro imprevisto
print(f"Erro inesperado: {e}")
# --- Dados de Teste ---
pressoes_ok = [100, 120, 140, 160, 180]
temperaturas_ok = [20, 25, 30, 35, 40]
pressoes_zero = [60, 120, 140, 160, 180]
temperaturas_zero = [0, 25, 30, 35, 40]
pressoes_tam_dif = [100, 120, 140, 160]
temperaturas_tam_dif = [20, 25, 30, 35, 40]
print("--- Teste 1: Dados Corretos ---")
print(divide_colunas(pressoes_ok, temperaturas_ok))
print("\n--- Teste 2: Erro de Divisão por Zero ---")
divide_colunas(pressoes_zero, temperaturas_zero)
print("\n--- Teste 3: Erro de Tamanho das Listas ---")
divide_colunas(pressoes_tam_dif, temperaturas_tam_dif)
O que acharam das soluções? O uso do try/except é um caminho sem volta para criarmos aplicações que saibam conversar com o usuário quando algo dá errado, em vez de apenas travar a tela com um erro de terminal.
Bons estudos!