Je suis fondamentalement en désaccord avec les réponses de Marc B et d'Artefacto. Il y a des cas où omettre le catch est préférable ou même la seule option. En particulier lors de l'utilisation de bibliothèques externes (où vous n'avez aucun contrôle sur les exceptions qui sont lancées) et/ou d'opérations asynchrones.
Par exemple :
Je veux créer un fichier uniquement s'il n'existe pas encore. J'utilise une bibliothèque d'E/S externe. Imaginez qu'elle ait File::exists($fileName)
y File::create($fileName)
méthodes.
Option 1 (si l'omission de la prise était possible) :
try {
File::create($fileName);
}
// Go on with the rest of the code.
Option 2 (sans try/catch) :
if (!File::exists($fileName))
File::create($fileName);
Ici, l'option 1 est parfaitement valable, car l'option 2 présente deux problèmes importants :
- Si plusieurs threads sont en cours d'exécution et parcourent cette section de code en même temps, il se peut que le thread A vérifie d'abord si le fichier existe. Ensuite, le thread B vérifie si le fichier existe. Ils constatent tous deux qu'il n'existe pas. Le thread A crée le fichier. Le thread B tente alors de le créer à nouveau et lève une exception, bien que vous utilisiez la vérification if.
- Il est très probable que la bibliothèque elle-même effectue déjà les tâches suivantes
!File::exists($fileName)
vérifier. Vous gaspillez donc un appel qui est déjà fait.
Notez que si File::create
lance d'autres exceptions qui pourraient être inattendues, il serait bon de les attraper.
Conclusion
Affirmer que quelque chose est jamais une bonne idée, est presque jamais une bonne idée. Il y a toujours des exceptions (hehe) à la règle. Comme toute convention ou modèle de conception, il s'agit simplement d'une règle empirique destinée à aider les développeurs moins expérimentés à prendre la bonne décision.
3 votes
Une exception ne doit pas être traitée comme "normale" - c'est une exception ou pas. Qu'est-ce qui déclenche les exceptions ?
0 votes
Je vérifie que le modèle lève une exception quand il le devrait. J'ai donc un bloc catch vide car je veux juste tester que l'exception a été levée.