1
resposta

[Sugestão] Desafio

1

try:
n1 = float(input("Número 1: "))
n2 = float(input("Número 2: "))
print(n1 / n2)

except ZeroDivisionError as e:
print("Erro:", e)

except ValueError as e:
print("Erro:", e)

2

idades = {'Júlia': 16, 'Carol': 23, 'Alberto': 19, 'Roberta': 17}

try:
nome = input("Nome: ")
print(idades[nome])

except KeyError:
print("Nome não encontrado")

3

def converte_float(lista):

try:
    return [float(x) for x in lista]

except ValueError as e:
    print("Erro:", e)

finally:
    print("Fim da execução da função")

print(converte_float(['1', '2', '3.5']))

4

def agrupa_listas(lista1, lista2):

try:

    if len(lista1) != len(lista2):
        raise IndexError(
            "A quantidade de elementos em cada lista é diferente."
        )

    return [
        (lista1[i], lista2[i], lista1[i] + lista2[i])
        for i in range(len(lista1))
    ]

except (IndexError, TypeError) as e:
    print("Erro:", e)

print(agrupa_listas([1,2,3], [4,5,6]))

5

gabarito = ['D', 'A', 'B', 'C', 'A']

def corrige(testes):

notas = []

for teste in testes:

    for alt in teste:

        if alt not in ['A','B','C','D']:
            raise ValueError(f"Alternativa inválida: {alt}")

    nota = sum(
        1 for r, g in zip(teste, gabarito) if r == g
    )

    notas.append(nota)

return notas

print(corrige([
['D','A','B','C','A'],
['C','A','A','C','A']
]))

6

def verifica(lista):

for palavra in lista:

    if ',' in palavra or '.' in palavra or '!' in palavra or '?' in palavra:
        raise ValueError(
            f'Pontuação encontrada em "{palavra}"'
        )

return "Texto OK"

print(verifica(['Python', 'é', 'legal']))

7

def divide_colunas(pressoes, temperaturas):

try:

    if len(pressoes) != len(temperaturas):
        raise ValueError("Listas de tamanhos diferentes")

    return [
        p / t for p, t in zip(pressoes, temperaturas)
    ]

except (ZeroDivisionError, ValueError) as e:
    print("Erro:", e)

print(divide_colunas(
[100,120,140],
[20,25,35]
))

1 resposta

Olá, Micael. Como vai?

Parabéns pela resolução dos desafios! O tratamento de exceções é um pilar fundamental da programação robusta, pois garante que o software saiba como reagir a comportamentos inesperados sem simplesmente "quebrar" para o usuário final.

Notei que você aplicou conceitos muito importantes, como o uso de múltiplas exceções em um mesmo bloco e a cláusula finally. Para agregar ainda mais valor ao seu estudo, separei alguns pontos técnicos e boas práticas sobre o que você desenvolveu:

  • Uso do raise: Nos exercícios 4, 5 e 6, você utilizou o raise para lançar exceções personalizadas. Essa é uma excelente prática conhecida como fail-fast (falhe rápido). Ao verificar uma condição de erro logo no início, você evita que o programa processe dados inválidos mais adiante.

  • Captura Específica: No exercício 1 e 7, você capturou erros específicos como ZeroDivisionError e ValueError. Isso é muito melhor do que usar um except Exception: genérico, pois evita que você esconda erros de sintaxe ou outros bugs que você não pretendia tratar naquele momento.

  • O Bloco else: Uma dica para complementar o seu exercício 1 é o uso do bloco else. Ele é executado apenas se nenhum erro ocorrer dentro do try. Isso ajuda a separar a lógica de "tentativa" da lógica de "sucesso".

Veja um exemplo aplicado ao seu primeiro código:

try:
    n1 = float(input("Número 1: "))
    n2 = float(input("Número 2: "))
    resultado = n1 / n2
except ZeroDivisionError:
    print("Erro: Não é possível dividir por zero.")
except ValueError:
    print("Erro: Digite apenas números válidos.")
else:
    print(f"O resultado da divisão é: {resultado}")
  • Dicionários e o método get: No exercício 2, você tratou o KeyError. Uma alternativa comum em Python quando não queremos que o programa lance uma exceção se a chave não existir é usar o método .get(), que permite definir um valor padrão de retorno:
# Retorna 'Não encontrado' se o nome não existir, sem lançar erro
print(idades.get(nome, "Nome não encontrado"))
  • Refatoração no Exercício 5: No desafio do gabarito, você usou um raise dentro de um laço aninhado. Lembre-se que, ao lançar uma exceção com raise, a execução da função é interrompida imediatamente. Se o seu objetivo for validar todas as notas e reportar os erros depois, você poderia armazenar as falhas em uma lista em vez de interromper o código no primeiro erro encontrado.

Seu domínio sobre as estruturas de repetição integradas com tratamento de erros está ficando muito sólido. Continue praticando essa mentalidade de prever o que pode dar errado, pois isso é essencial em projetos de Data Science, onde os dados de entrada nem sempre estão limpos ou organizados.

Espero que possa ter lhe ajudado!