Ei! Tudo bem, Leonam?
Não existe uma regra fixa, mas existe uma boa prática conceitual: a função deve tratar apenas os erros que ela realmente sabe resolver.
Se o erro faz parte da responsabilidade da função, faz sentido usar try-except dentro dela. Por exemplo, se a função já espera que possa receber um valor inválido e quer retornar algo padrão ou uma mensagem amigável, ela mesma pode tratar isso.
Agora, se o erro é algo que o código “de cima” precisa decidir o que fazer (encerrar o programa, pedir novo input, registrar log, etc.), então o ideal é deixar a exceção subir e tratar fora da função.
Em projetos maiores, é muito comum:
– A função levantar a exceção (raise)
– E o tratamento acontecer em um nível mais alto da aplicação
Isso evita esconder erros silenciosamente e deixa o sistema mais organizado. A sua pergunta foi ótima, demonstra um pensamento de quem já está evoluindo do "saber do código" para "saber arquitetura"!
Espero ter ajudado. Conte sempre com o nosso apoio aqui no fórum em dúvidas e sugestões!
Bons estudos e até mais!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado