Olá, Marcelo. Como vai?
Mais uma vez, parabéns pela excelente iniciativa de ir além da atividade proposta! Incluir recorrência com laço while, tratamento de exceções com try/except e validações lógicas de negócio (como impedir que o ano de nascimento seja maior que o ano atual) são hábitos ótimos que diferenciam um bom desenvolvedor no mercado de trabalho.
O seu código está muito bem estruturado e cumpre perfeitamente o papel proposto, tratando tanto erros de digitação de texto quanto erros de consistência dos dados de forma limpa.
Para agregar ainda mais valor ao seu exercício e complementar o seu treinamento de funções e boas práticas, podemos pensar em um pequeno detalhe sobre a assinatura e o comportamento da sua função calcular_idade.
No seu código atual, a validação if ano_nascimento > ano_atual: foi feita fora da função, diretamente no fluxo do programa principal. No design de software, costumamos dizer que é uma boa prática tornar as nossas funções "independentes" e "inteligentes", deixando que elas próprias validem as regras de negócio dos dados que recebem. Além disso, assim como vimos em exercícios anteriores, podemos usar a biblioteca datetime para deixar o parâmetro do ano_atual como opcional, pegando o ano real do sistema de forma automática caso o usuário não informe um.
Veja esta sugestão de como modularizar e enriquecer ainda mais a sua função:
from datetime import datetime
def calcular_idade(ano_nascimento, ano_atual=None):
# Se o ano atual não for informado, pega o ano real do sistema
if ano_atual is None:
ano_atual = datetime.now().year
# A própria função valida os dados e dispara uma exceção se algo estiver errado
if ano_nascimento > ano_atual:
raise ValueError("O ano de nascimento não pode ser maior que o ano atual.")
return ano_atual - ano_nascimento
# Fluxo de entrada do usuário
while True:
try:
ano_nasci = int(input("Digite o ano de nascimento: "))
# Chamando a função apenas com o ano de nascimento (usando o ano atual automático do sistema)
idade = calcular_idade(ano_nasci)
print(f"A idade é {idade} anos.")
break
except ValueError as erro:
# Se o erro veio do raise da função, exibe a mensagem personalizada da regra de negócio
if str(erro):
print(erro)
else:
print("Por favor, insira números inteiros para o ano de nascimento.")
Com essa abordagem, a sua função se torna completamente reutilizável para outros lugares do sistema (como um cadastro de clientes, por exemplo), pois ela carrega a regra de validação e a inteligência de obter a data do sistema consigo mesma.
Excelente trabalho mantendo o foco em criar códigos seguros e robustos!
Espero que possa ter lhe ajudado!