Exception
est le type de base pour toutes les exceptions, et en tant que tel terriblement non spécifique. Vous ne devriez jamais lever cette exception car elle ne contient tout simplement aucune information utile. L'appel de code capturant des exceptions ne pouvait pas lever l'ambiguïté de l'exception intentionnellement levée (de votre logique) à partir d'autres exceptions système qui sont totalement indésirables et signalent de véritables erreurs.
La même raison s'applique également à SystemException
. Si vous regardez la liste des types dérivés, vous pouvez voir un grand nombre d'autres exceptions avec une sémantique très différente.
NullReferenceException
et IndexOutOfRangeException
sont d'une nature différente. Maintenant, ce sont des exceptions très spécifiques, donc les lancer pourrait être bien. Cependant, vous ne voudrez toujours pas les lancer, car ils signifient généralement qu'il y a de réelles erreurs dans votre logique. Par exemple, l'exception de référence nulle signifie que vous essayez d'accéder à un membre d'un objet qui est null
. Si c'est une possibilité dans votre code, vous devriez toujours vérifier explicitement null
et lancer une exception plus utile à la place (par exemple ArgumentNullException
). De même, les IndexOutOfRangeException
s se produisent lorsque vous accédez à un index non valide (sur des tableaux et non sur des listes). Vous devez toujours vous assurer de ne pas faire cela en premier lieu et vérifier d'abord les limites d'un tableau, par exemple.
Il existe quelques autres exceptions comme celles-ci, par exemple InvalidCastException
ou DivideByZeroException
, qui sont lancées pour des erreurs spécifiques dans votre code et signifient généralement que vous faites quelque chose de mal ou que vous ne vérifiez pas d'abord certaines valeurs non valides. En les jetant sciemment à partir de votre code, vous rendez simplement plus difficile pour le code appelant de déterminer s'ils ont été lancés en raison d'une erreur dans le code, ou simplement parce que vous avez décidé de les réutiliser pour quelque chose dans votre implémentation.
Bien sûr, il existe quelques exceptions (hah) à ces règles. Si vous créez quelque chose qui peut provoquer une exception qui correspond exactement à une exception existante, n'hésitez pas à l'utiliser, en particulier si vous essayez de faire correspondre un comportement intégré. Assurez-vous simplement de choisir un type d'exception très spécifique.
En général cependant, à moins que vous ne trouviez une exception (spécifique) qui répond à vos besoins, vous devriez toujours envisager de créer vos propres types d'exceptions pour des exceptions attendues spécifiques. Surtout lorsque vous écrivez du code de bibliothèque, cela peut être très utile pour séparer les sources d'exceptions.