Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Desafio: hora da prática (Aquecimento)

# Questão 1: Calcule a divisão entre dois números float

try:

    # entrada dos números
    num1 = float(input("Digite o primeiro número: "))
    num2 = float(input("Digite o segundo número: "))

    # cálculo da divisão
    divisao = num1 / num2

    # exibindo o resultado
    print(f"Resultado da divisão: {divisao}")

# erro para divisão por zero
except ZeroDivisionError:

    print("Erro: não é possível dividir um número por zero.")

# erro para entrada de texto
except ValueError:

    print("Erro: o valor digitado é inválido.")

# exibição do tipo de erro
except Exception as erro:

    print(f"Ocorreu um erro: {type(erro).__name__}")
# Questão 2: Pesquise uma chave em um dicionário com tratamento de erro

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

try:

    # entrada do nome
    nome = input("Digite um nome: ")

    # busca da idade no dicionário
    idade = idades[nome]

    # exibindo o resultado
    print(f"Idade: {idade}")

# tratamento para chave inexistente
except KeyError:

    print("Nome não encontrado")
# Questão 3: Converta os valores de uma lista para float

# função para converter os valores
def converter_float(lista):

    try:

        # conversão dos valores para float
        lista_float = [float(valor) for valor in lista]

        # retorno da nova lista
        return lista_float

    # tratamento de erro
    except Exception as erro:

        print(f"Ocorreu um erro: {type(erro).__name__}")

    finally:

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

# lista para teste
valores = ['10', '5.5', '8', 'texto']

# chamada da função
resultado = converter_float(valores)

# exibindo o resultado
print(resultado)
# Questão 4: Agrupe os elementos de duas listas em tuplas

# função para agrupar os valores
def agrupar_listas(lista1, lista2):

    try:

        # verificação do tamanho das listas
        if len(lista1) != len(lista2):
            raise IndexError(
                'A quantidade de elementos em cada lista é diferente.'
            )

        # criação da lista de tuplas
        resultado = [
            (lista1[i], lista2[i], lista1[i] + lista2[i])
            for i in range(len(lista1))
        ]

        # retorno da lista
        return resultado

    # tratamento de erro para tamanhos diferentes
    except IndexError as erro:

        print(erro)

    # tratamento de outros erros
    except Exception as erro:

        print(f"Ocorreu um erro: {type(erro).__name__}")

# listas para teste
lista1 = [4, 6, 7, 9, 10]
lista2 = [-4, 6, 8, 7, 9]

# chamada da função
resultado = agrupar_listas(lista1, lista2)

# exibindo o resultado
print(resultado)
# Questão 5: Função para correção das notas

def corrige_provas(gabarito, testes):

    notas = []

    # verificação de cada teste
    for teste in testes:

        nota = 0

        # verificação de cada resposta
        for i in range(len(teste)):

            # validação das alternativas
            if teste[i] not in ['A', 'B', 'C', 'D']:
                raise ValueError(
                    f"A alternativa {teste[i]} não é uma opção de alternativa válida"
                )

            # soma da pontuação
            if teste[i] == gabarito[i]:
                nota += 1

        notas.append(nota)

    return notas
# Questão 5: Testando no exemplo que não lança exceção

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

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

try:

    notas = corrige_provas(gabarito, testes_sem_ex)

    print(notas)

except ValueError as erro:

    print(erro)
# Questão 5: Testando no exemplo que lança exceção

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

testes_com_ex = [
    ['D', 'A', 'B', 'C', 'A'],
    ['C', 'A', 'A', 'E', 'A'],
    ['D', 'B', 'A', 'C', 'A']
]

try:

    notas = corrige_provas(gabarito, testes_com_ex)

    print(notas)

except ValueError as erro:

    print(erro)
2 respostas
solução!

Olá, Estudante! Como vai?

Parabéns por concluir esse aquecimento! Lidar com exceções é o que separa um código "que funciona" de um código "à prova de falhas". Você demonstrou um domínio excelente do bloco try-except-finally e, principalmente, do uso da palavra-chave raise para criar suas próprias regras de validação.

Gostaria de destacar alguns pontos técnicos brilhantes na sua resolução:

1. Especificidade nos Erros (Questão 1 e 2)

Um erro comum é usar um except Exception genérico para tudo. Você foi cirúrgico ao tratar o ZeroDivisionError (divisão por zero), o ValueError (entrada de texto onde deveria ser número) e o KeyError (chave inexistente no dicionário). Isso ajuda muito o usuário final a entender exatamente o que ele fez de errado.

2. O uso do finally (Questão 3)

A cláusula finally é essencial para garantir que certas ações aconteçam, independentemente de ter ocorrido um erro ou não. No seu caso, a mensagem "Fim da execução" aparece sempre, o que em sistemas reais é usado para fechar conexões com bancos de dados ou arquivos abertos.

3. Lançando Exceções com raise (Questão 4 e 5)

Aqui você subiu de nível! Na Questão 4, você identificou que listas de tamanhos diferentes não causariam um erro imediato no Python, mas causariam um erro de lógica no seu cálculo. Ao usar o raise IndexError, você assumiu o controle da regra de negócio.

4. Validação de Regras de Negócio (Questão 5)

Sua função de correção de provas está excelente. A validação das alternativas ['A', 'B', 'C', 'D'] é um exemplo perfeito de como evitar que dados "sujos" (como o 'E' no seu teste) estraguem o processamento dos dados.


Dica Técnica: Capturando a Mensagem do Erro

Nas questões onde você usou except Exception as erro, você exibiu o nome do erro com type(erro).__name__. Isso é ótimo para debugar! Se você quiser exibir a mensagem amigável que o próprio Python gera, pode usar apenas print(f"Ocorreu um erro: {erro}").

Um Pequeno Desafio Extra:

Na Questão 3, ao tentar converter ['10', '5.5', '8', 'texto'], o Python para a execução assim que encontra o 'texto'. Como você alteraria esse código para que ele pulasse os valores inválidos e retornasse a lista apenas com os números convertidos, em vez de parar tudo?

Dica: Pense em colocar o try-except dentro da list comprehension ou do laço for.

Seu progresso é nítido, Estudante. Continue com essa atenção aos detalhes, pois o tratamento de exceções é fundamental para a área de Data Science, onde lidamos com dados incompletos ou mal formatados o tempo todo!

Espero que possa ter lhe ajudado!

Obrigado pela dica