Programação é sobre trabalho
Eu acho que a maneira mais fácil de responder a isso é entender o progresso que a OOP fez ao longo dos anos. Tudo o que é feito no OOP (e na maioria dos paradigmas de programação) é modelado em torno da necessidade de trabalho .
Toda vez que um método é chamado, o chamador está dizendo "Eu não sei como fazer esse trabalho, mas você sabe como, então você faz isso por mim".
Isso apresentou uma dificuldade: o que acontece quando o método chamado geralmente sabe como fazer o trabalho, mas nem sempre? Precisávamos de uma maneira de nos comunicar "Eu realmente queria ajudá-lo, mas realmente não posso fazer isso".
Uma metodologia inicial para comunicar isso era simplesmente retornar um valor "lixo". Talvez você espere um número inteiro positivo, portanto o método chamado retorna um número negativo. Outra maneira de conseguir isso era definir um valor de erro em algum lugar. Infelizmente, as duas formas resultaram no código padrão, deixe-me verificar aqui para garantir que tudo é kosher . À medida que as coisas ficam mais complicadas, esse sistema desmorona.
Uma analogia excepcional
Digamos que você tenha carpinteiro, encanador e eletricista. Você quer encanador para consertar sua pia, então ele dá uma olhada nela. Não é muito útil se ele disser apenas a você: "Desculpe, não posso consertar. Está quebrado." Inferno, é ainda pior se ele der uma olhada, sair e enviar uma carta para você dizendo que não poderia consertar. Agora você precisa verificar seu e-mail antes mesmo de saber que ele não fez o que você queria.
O que você prefere é que ele lhe diga: "Olha, eu não consegui consertar, porque parece que sua bomba não está funcionando".
Com essas informações, você pode concluir que deseja que o eletricista dê uma olhada no problema. Talvez o eletricista encontre algo relacionado ao carpinteiro, e você precisará que ele conserte.
Caramba, você pode nem saber que precisa de um eletricista, pode não saber de quem precisa. Você é apenas gerente de nível médio em um negócio de consertos domésticos e seu foco é o encanamento. Então você diz a seu chefe sobre o problema e ele diz ao eletricista para consertá-lo.
É isso que as exceções estão modelando: modos de falha complexos de maneira dissociada. O encanador não precisa saber sobre eletricista - ele nem precisa saber que alguém na cadeia pode resolver o problema. Ele apenas relata o problema que encontrou.
Então ... um anti-padrão?
Ok, entender o ponto de exceção é o primeiro passo. O próximo é entender o que é um antipadrão.
Para se qualificar como um antipadrão, ele precisa
- resolva o problema
- tem consequências definitivamente negativas
O primeiro ponto é facilmente encontrado - o sistema funcionou, certo?
O segundo ponto é mais pegajoso. O principal motivo para usar exceções como fluxo de controle normal é ruim é porque esse não é o objetivo delas. Qualquer funcionalidade fornecida em um programa deve ter um objetivo relativamente claro, e a cooptação desse objetivo gera confusão desnecessária.
Mas isso não é um dano definitivo . É uma maneira ruim de fazer as coisas, e estranha, mas um anti-padrão? Não. Apenas ... estranho.