Meu caso específico aqui é que o usuário pode passar uma string para o aplicativo, o aplicativo analisa e atribui a objetos estruturados. Às vezes, o usuário pode digitar algo inválido. Por exemplo, suas informações podem descrever uma pessoa, mas elas podem dizer que sua idade é "maçã". O comportamento correto nesse caso é reverter a transação e informar ao usuário que ocorreu um erro e eles terão que tentar novamente. Pode haver um requisito para relatar todos os erros que podemos encontrar na entrada, não apenas o primeiro.
Nesse caso, argumentei que deveríamos lançar uma exceção. Ele discordou, dizendo: "Exceções devem ser excepcionais: espera-se que o usuário insira dados inválidos, portanto esse não é um caso excepcional". Eu realmente não sabia como argumentar sobre esse ponto, porque, por definição da palavra, ele parece estar certo.
Mas, entendo que é por isso que as exceções foram inventadas em primeiro lugar. Antes, você tinha que inspecionar o resultado para ver se havia um erro. Se você não verificasse, coisas ruins poderiam acontecer sem você perceber.
Sem exceções, todos os níveis da pilha precisam verificar o resultado dos métodos que chamam e, se um programador esquecer de fazer check-in em um desses níveis, o código poderá prosseguir acidentalmente e salvar dados inválidos (por exemplo). Parece mais propenso a erros dessa maneira.
De qualquer forma, fique à vontade para corrigir qualquer coisa que eu tenha dito aqui. Minha principal pergunta é se alguém diz que as exceções devem ser excepcionais. Como saber se meu caso é excepcional?