Es ist sehr angemessen, eine robuste und gut gestaltete Ausnahme-API zu haben, die konsistent ist. Dies zur Durchsetzung von Geschäftsregeln zu verwenden, kann ebenfalls angemessen sein. Meiner Erfahrung nach ist es umso wahrscheinlicher, dass die Geschäftsregel so gehandhabt wird, je komplizierter sie ist. Es ist oft genauso einfach, wenn nicht sogar einfacher, ein System zu schreiben, in dem Ausnahmen erwartet werden, als autorisierende Verzweigungslogik zu schreiben.
Dies bedeutet, dass einfache Regeln, die in einem Satz beschrieben werden können, in der Regel präventiv oder autoritativ implementiert werden sollten, je nachdem, um welche es sich handelt. Wenn Sie jedoch eine mehrdimensionale Regel haben, für die mehr als drei oder vier Faktoren erforderlich sind (insbesondere, wenn die Auswahl dieser Faktoren auf einem oder mehreren der anderen Faktoren basiert), kann die Ausnahmecodierung möglicherweise besser verwaltet werden. In diesen Fällen müssen auf dem Logikpfad häufig Vorgängerausnahmen ausgelöst werden (es wird geprüft, warum die Aktion nicht ausgeführt werden kann), und dann (oder umgekehrt) wird die Sicherheit beeinträchtigt (um zu überprüfen, ob die Aktion autorisiert ist) ), manchmal gibt es eine autorisierende Akkumulationslogik, die überprüft werden muss (Verfügbarkeit von Nachkommen / Vorfahren, Vorläuferstatus, in den Objekte eingefügt werden müssen, usw.
Ein Vorteil dieser Art der Ausnahmebedingung besteht darin, dass Sie die Vorläuferausnahmen in mehreren Bereichen Ihres Projekts trennen und wiederverwenden können. (Dies ist die Essenz der aspektorientierten Programmierung.) Auf diese Weise kapseln Sie einen bestimmten Aspekt Ihrer allgemeinen Geschäftsregeln in einer eigenständigen und wartbaren Komponente. Im Allgemeinen entsprechen diese Komponenten 1-1 den ausgegebenen Fehlermeldungen. (Obwohl Sie manchmal eine Komponente haben, die mehrere verschiedene Ausnahmen auslöst, sollten Sie fast nie dieselbe Ausnahme von mehreren Komponenten auslösen.)
Meiner Meinung nach ist es schwieriger, Systeme zu entwerfen, die auf Ausnahmen basieren, und die anfängliche Entwicklungszeit ist länger, da Sie den Ausnahmevorgang über alle N Ebenen hinweg erstellen müssen. Im Allgemeinen sind diese Systeme jedoch wesentlich stabiler. Während es niemals möglich ist, ein System zu entwerfen, das nicht ausfällt, besteht der Vorteil eines ausnahmebasierten Entwurfs darin, dass Sie immer mit einem Ausfall rechnen. Für die meisten Menschen kann der Prozess kontraintuitiv sein. Es ist, als würde man nach dem Weg fragen und sich von jemandem sagen lassen, dass man nicht abbiegen sollte.