Benutzerdefinierte Ausnahmen
Falls ein nicht behebbarer Fehler auftreten sollte, arbeitet die Lösung für die Geschäftsprozessverwaltung mit einer Kombination aus Ausnahmehandlern und benutzerdefinierten Ausnahmen.
Behandeln von Ausnahmen
Anstatt Terminate-Shapes in aufgerufenen Orchestrierungen zu verwenden, können Sie das Muster des Auslösens von Ausnahmen verwenden, die von der Stammorchestrierung behandelt werden. Dadurch kann die Orchestrierung mit den umfassendsten Kenntnissen des Kontexts die Entscheidung zur Behandlung der Ausnahme treffen. Wenn die untergeordneten Orchestrierungen benutzerdefinierte Ausnahmen auslösen, können Sie spezifischere Informationen an die Stammorchestrierung übermitteln.
Die Lösung für die Geschäftsprozessverwaltung folgt diesem Muster. In der Lösung gibt es vier Stamm- oder Nichtaufruf-Orchestrierungen: OrderBroker, OrderManager, CableOrder1 und CableOrder2. Drei der Stamm orchestrierungen empfangen und behandeln benutzerdefinierte Ausnahmen: OrderManager, CableOrder1 und CableOrder2.
Beachten Sie, dass einige der Stammorchestrationen das Shape Terminate verwenden und dass das Shape Terminate unmittelbar vor dem normalen Endpunkt der Orchestrierung angezeigt wird. Die Orchestrierung verwendet weiterhin die Terminate-Form im Falle eines Fehlers, sodass die Orchestrierung als beendet und nicht als abgeschlossen, sondern mit einer Fehlermeldung aufgezeichnet wird. Dadurch kann die Lösung zusätzlich zum Aufzeichnen des Fehlers auch fehlerhafte Instanzen mühelos nachverfolgen.
Weitere Informationen zur Terminate-Form finden Sie unter Konfigurieren der Terminate-Form. Weitere Informationen zur ThrowException-Form finden Sie unter Konfigurieren des Throw Exception-Shapes.
Die benutzerdefinierten Ausnahmen
Jede der drei folgenden benutzerdefinierten Ausnahmen folgt demselben Muster. Aufgrund der verschiedenen Typen kann der Code unterschiedliche Ausnahmen unterscheiden.
Ausnahme | Ausgelöst von (Orchestrierung) |
---|---|
ActivateException | Änderung |
CableOrderException | Activate, CableOrder1 |
InterruptException | CableOrder1, CheckInterrupt, ErrorHandlerOrch |
Alle benutzerdefinierten Ausnahmen werden in der Utilities-Assembly definiert. Die benutzerdefinierten Ausnahmen sind allesamt .NET-Klassen. Alle benutzerdefinierten Ausnahmeklassen erben von der .NET ApplicationException-Klasse , die wiederum von der System.Exception-Klasse erbt. Da die Möglichkeit besteht, dass die Ausnahme ggf. pausiert (serialisiert und in der Datenbank gespeichert wurde), müssen die Ausnahmen einen Deserialisierungskonstruktor implementieren. Ein Deserialisierungskonstruktor ist ein Konstruktor, der zwei Argumente akzeptiert: ein SerializationInfo-Objekt und ein StreamingContext-Objekt. Der Deserialisierungskonstruktor wird während der Aktivierung der Ausnahme verwendet. Da die ApplicationException-Klasse bereits einen Deserialisierungskonstruktor implementiert, ruft der Konstruktor für die benutzerdefinierte Ausnahme einfach den Basis-Deserialisierungskonstruktor (ApplicationException) auf. Die InterruptException enthält beispielsweise den folgenden Konstruktor:
// "info" is the object holding the serialized object data.
// "context" is the contextual information about the source
// or destination.
public InterruptException(SerializationInfo info,
StreamingContext context) : base(info, context) { }
Ausführlichere Informationen zur benutzerdefinierten Serialisierung finden Sie unter Benutzerdefinierte Serialisierung im .NET Framework Entwicklerhandbuch.
Geschachtelte Ausnahmehandler und Kompensierungsblöcke
Zusätzlich zu ihrem Zweck als spezialisierte Ausnahmen dienen die benutzerdefinierten Ausnahmen an mehreren Stellen als Sortierungskennzeichen. In der Änderungsorchestrierung gibt es zwei Stellen, an denen für den Abbruchvorgang ein Rollback ausgeführt werden muss.
Hinweis
Möglicherweise möchten Sie diesen Abschnitt lesen, in dem die Änderungsorchestrierung in Visual Studio geöffnet ist.
Wenn der Aufruf der Cancel-Orchestrierung am Anfang der Orchestrierung fehlschlägt, wird der CancelCompensation-Block ausgeführt und führt einen Rollback für die Cancel-Transaktion aus. Wenn alles gut geht, ruft die Orchestrierung die Orchestrierung aktivieren auf.
Wenn der Aktivierungsvorgang fehlschlägt, muss auch für die Abbruchtransaktion ein Rollback ausgeführt werden. Der Ausnahmehandler für den Aufruf von Activate weiß jedoch nichts über die Abbruchtransaktion . Um dies behandeln zu können, gibt es einen Ausnahmehandler für die gesamte Orchestrierung. Dieser Handler, da er den Cancel-Bereich enthält, kennt die Cancel-Transaktion . Der Handler fängt die Ausnahme ab, die vom Activate-Bereich ( ActivateException) ausgelöst wird, führt einen Rollback für die Cancel-Transaktion aus und löst dann die Ausnahme erneut aus, sodass die Orchestrierung, die die Änderungsorchestrierung aufgerufen hat, eine zusätzliche Verarbeitung durchführen kann.
Beachten Sie, dass dieser Entwurf das Abbrechen nur entschädigt, wenn die Aktivierung fehlschlägt. Wenn beim Abbrechen ein Fehler auftritt und eine Ausnahme ausgelöst wird, wurde der Abbruch nie durchgeführt und sollte nicht kompensiert werden.
Weitere Informationen zu Kompensationsblöcken und der Kompensierungsform finden Sie unter Konfigurieren der Kompensierungsform.
Weitere Informationen
Ausnahmebehandlung in der Lösung für die Geschäftsprozessverwaltung
Die Orchestrierung „ExceptionHandler“