Salut,
Sémantiquement, les exceptions devraient être gérées pour ce qu'elles sont : des erreurs _exceptionnelles_. Par conséquent, si c'est pour vérifier un input utilisateur, une vérification manuelle peut mieux convenir, puisque tu sais que c'est probable.
À côté, prenons l'exemple d'une connexion à un serveur : tu ne maîtrises pas toutes les conditions nécessaires à la réussite de ton bout de code : des erreurs peuvent arriver ou ne pas arriver, et t'as pas vraiment moyen de le savoir. Il est donc judicieux d'utiliser ici des exceptions, qui se chargent de récupérer les éventuelles erreurs de serveur indisponible ou timeout pour retourner un message type 'Serveur indisponible'.
La limite est assez floue, mais moi je considère, en règle générale, que si on peut facilement prévoir l'erreur et ses conditions, et/ou si on a un input utilisateur, on vérifie manuellement. Le cas contraire, on prévoit de la récupération d'exceptions.
En pratique, les exceptions peuvent être bien utiles pour avoir à écrire moins de code dans certaines conditions, alors on trouve aussi souvent des récupérations 'fourre-tout' dans des cas où de la vérification manuelle aurait semblé plus logique. Mais ça après...