Il est très approprié d'avoir une API d'exception robuste et bien conçue qui soit cohérente. L'utiliser pour appliquer les règles métier peut également être approprié. En fait, d'après mon expérience, plus la règle commerciale est compliquée, plus elle est susceptible d'être traitée de cette façon. Il est souvent aussi simple, sinon plus facile, d'écrire un système dans lequel des exceptions sont attendues que d'écrire une logique de branchement faisant autorité.
Cela revient à dire que les règles simples qui peuvent être décrites en une seule phrase doivent généralement être mises en œuvre de manière préventive ou faisant autorité selon le cas. Cependant, si vous avez une règle qui est multidimensionnelle et nécessite plus de trois ou quatre facteurs (en particulier si la sélection de ces facteurs est basée sur un ou plusieurs des autres facteurs), le codage d'exception peut être plus facile à gérer. Souvent, dans ces cas, le chemin logique comporte de nombreuses exceptions de précurseurs qui doivent être levées (vérifie pourquoi l'action ne peut pas être effectuée), puis (ou vice versa), il y a une défaillance de la sécurité (pour vérifier que l'action est autorisée ), il y aura parfois une logique d'accumulation faisant autorité qui doit être vérifiée (disponibilité des descendants / ancêtres, états précurseurs dans lesquels les objets doivent être placés, etc.)
Un avantage qui dérive de ce type de levée d'exceptions est qu'il vous permet de séparer et de réutiliser les exceptions de précurseur dans plusieurs zones de votre projet. (C'est l'essence même de la programmation orientée aspect.) Ce faisant, vous encapsulez un aspect particulier de vos règles commerciales générales dans un composant autonome et maintenable. En général, ces composants correspondront 1-1 aux messages d'erreur lancés. (Bien que parfois vous ayez un composant qui lève plusieurs exceptions différentes, vous ne devriez presque jamais avoir la même exception levée à partir de plusieurs composants.)
À mon avis, il est plus difficile de concevoir des systèmes basés sur des exceptions et le temps de développement initial est plus long, car vous devez créer le processus d'exception à tous les N niveaux. Cependant, ces systèmes finissent généralement par être beaucoup plus stables. Bien qu'il ne soit jamais possible de concevoir un système qui «n'échouera pas», l'avantage de la conception basée sur les exceptions est que vous anticipez toujours une défaillance. Pour la plupart des gens, le processus peut être contre-intuitif. C'est comme demander des directions et demander à quelqu'un de vous dire toutes les rues que vous ne devriez pas activer.