Olá Gabriel, tudo bem?
A decisão de quando lançar uma exceção pode depender de vários fatores, incluindo a regra de negócio, a gravidade do erro e o fluxo de controle do programa.
Em geral, você deve lançar uma exceção quando ocorrer uma condição excepcional, ou seja, algo que impede que um método cumpra seu propósito e que não deveria ter ocorrido nesse nível.
Por exemplo, se você tem um método que salva alterações em um registro em um banco de dados e, por algum motivo, isso não pode ser feito (por exemplo, ocorre algum erro no banco de dados), então você pode lançar uma exceção para indicar a falha.
Por outro lado, se um método está apenas verificando a existência de um arquivo, provavelmente não deveria lançar uma exceção se o arquivo não existir, uma vez que o objetivo do método é verificar a existência.
No caso da validação do CPF, se a validação é uma operação comum e esperada, pode fazer mais sentido retornar um valor booleano ou algum tipo de objeto de resultado que indique se a validação foi bem-sucedida ou não.
Se um CPF inválido é uma condição excepcional e indica um erro grave que deve interromper o fluxo normal do programa, então lançar uma exceção pode ser apropriado.
Em resumo, a decisão de quando lançar uma exceção depende do contexto específico e das necessidades do seu programa.
É uma prática comum lançar exceções para indicar condições de erro que são inesperadas ou que requerem uma mudança especial no fluxo de controle do programa.
Espero que isso ajude! Se você tiver mais perguntas, fique à vontade para perguntar.