Freigeben über


Benutzerdefinierte Ausnahmen

In Situationen, in denen ein nicht behebbarer Fehler auftritt, verwendet die Business Process Management-Lösung eine 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 nutzen, die von der Stamm-Orchestrierung behandelt werden. Dies ermöglicht es der Orchestrierung mit dem größtmöglichen Wissen über den Kontext, die Entscheidung über die Behandlung der Ausnahme zu treffen. Wenn die untergeordneten Orchestrierungen benutzerdefinierte Ausnahmen auslösen, können Sie spezifischere Informationen an die Stamm-Orchestrierung übermitteln.

Die Geschäftsprozessverwaltungslösung folgt diesem Muster. In der Lösung gibt es vier Stamm-Orchestrierungen, die nicht aufgerufen werden: OrderBroker, OrderManager, CableOrder1 und CableOrder2. Drei der Stamm-Orchestrierungen empfangen und behandeln benutzerdefinierte Ausnahmen: OrderManager, CableOrder1 und CableOrder2.

Beachten Sie, dass einige der Stamm-Orchestrierungen das Terminate-Shape verwenden und dass das Terminate-Shape unmittelbar vor dem normalen Endpunkt der Orchestrierung angezeigt wird. Die Orchestrierung verwendet weiterhin das Terminate-Shape bei einem Fehler, sodass die Orchestrierung als beendet und nicht als abgeschlossen, aber mit einer Fehlermeldung aufgezeichnet wird. Auf diese Weise kann die Lösung fehlgeschlagene Instanzen zusätzlich zur Aufzeichnung des Fehlers problemlos nachverfolgen.

Weitere Informationen zur Terminieren-Form finden Sie in So konfigurieren Sie die Terminieren-Form. Weitere Informationen zum ThrowException-Shape finden Sie unter Konfigurieren der Throw Exception-Shape.

Die benutzerdefinierten Ausnahmen

Jede der folgenden drei benutzerdefinierten Ausnahmen folgt demselben Muster. Mit unterschiedlichen Typen kann der Code unterschiedliche Ausnahmen unterscheiden.

Exception Ausgelöst durch (Orchestrierung)
ActivateException Ändern
CableOrderException Activate, CableOrder1
InterruptException CableOrder1, CheckInterrupt, ErrorHandlerOrch

Alle benutzerdefinierten Ausnahmen werden in der Dienstprogrammassembly definiert. Die benutzerdefinierten Ausnahmen sind alle .NET-Klassen. Alle benutzerdefinierten Ausnahmeklassen erben von der .NET ApplicationException-Klasse , die wiederum von der System.Exception-Klasse erbt. Da es eine Möglichkeit gibt, dass die Ausnahme dehydratisiert (serialisiert und in der Datenbank gespeichert) werden kann, 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 Rehydrierung 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. Beispielsweise enthält die InterruptException 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 im .NET Framework Developer's Guide.

Geschachtelte Ausnahmehandler und Kompensationsblöcke

Zusätzlich zu speziellen Ausnahmen dienen die benutzerdefinierten Ausnahmen an mehreren Stellen auch als Sortierkennzeichnung. In der Änderungs-Orchestrierung gibt es zwei Stellen, an denen der Cancel-Vorgang zurückgesetzt werden muss.

Hinweis

Sie möchten diesen Abschnitt möglicherweise mit der geöffneten Change-Orchestrierung in Visual Studio lesen.

Am Anfang der Orchestrierung, wenn der Aufruf der Cancel-Orchestrierung fehlschlägt, wird der CancelCompensation-Block ausgeführt und die Cancel-Transaktion zurückgesetzt. Wenn alles gut geht, ruft die Orchestrierung dann die Activate-Orchestrierung auf.

Wenn der Aktivierungsvorgang fehlschlägt, muss die Cancel-Transaktion auch zurückgesetzt werden. Der Ausnahmehandler für den Aufruf von Activate kennt jedoch nichts über die Cancel-Transaktion . Um dies zu behandeln, gibt es einen Ausnahmehandler für die gesamte Orchestrierung. Dieser Handler, da er den Bereich "Cancel " enthält, kennt die Cancel-Transaktion . Der Handler fängt die Ausnahme ab, die aus dem Activate-Bereich (ActivateException) ausgelöst wird, rollt die Cancel-Transaktion zurück und löst dann die Ausnahme erneut aus, sodass die Orchestrierung, die die Änderungs-Orchestrierung aufgerufen hat, weitere Verarbeitungen durchführen kann.

Beachten Sie, dass dieser Entwurf den Cancel nur kompensiert, wenn die Aktivierung fehlschlägt. Wenn " Abbrechen " fehlschlägt und eine Ausnahme auslöst, wurde " Abbrechen " nie ausgeführt und sollte nicht kompensiert werden.

Weitere Informationen zu Kompensationsblöcken und dem Ausgleichs-Shape finden Sie unter Konfigurieren des Ausgleichs-Shapes.

Siehe auch

Ausnahmebehandlung in der Geschäftsprozessverwaltungslösung
Die ExceptionHandler-Orchestrierung