Freigeben über


Ausnahmen

Dieses Thema gilt für Windows Workflow Foundation 4.

Die TryCatch-Aktivität kann zur Behandlung von Ausnahmen verwendet werden, die während der Ausführung eines Workflows ausgelöst werden. Diese Ausnahmen können behandelt oder mit der Rethrow-Aktivität erneut ausgelöst werden. Aktivitäten im Abschnitt Finally werden nach Abschluss des Abschnitts Try oder des Abschnitts Catches ausgeführt. Von einer WorkflowApplication-Instanz gehostete Workflows können auch den OnUnhandledException-Ereignishandler verwenden, um Ausnahmen zu behandeln, die nicht von einer TryCatch-Aktivität behandelt werden.

Ursachen von Ausnahmen

In einem Workflow können Ausnahmen auf die folgenden Arten ausgelöst werden:

  • Ein Timeout von Transaktionen in TransactionScope.

  • Eine explizite vom Workflow mit der Throw-Aktivität ausgelöste Ausnahme.

  • Eine von einer Aktivität ausgelöste .NET Framework 4-Ausnahme.

  • Eine von externem Code ausgelöste Ausnahme, z. B. Bibliotheken, Komponenten oder Dienste, die im Workflow verwendet werden.

Behandeln von Ausnahmen

Wenn eine Ausnahme von einer Aktivität ausgelöst und nicht behandelt wird, ist das Beenden der Workflowinstanz das Standardverhalten. Wenn ein benutzerdefinierter OnUnhandledException-Handler vorhanden ist, kann dieser das Standardverhalten überschreiben. Mit diesem Handler kann der Autor des Workflowhosts die angemessene Behandlung bereitstellen, z. B. benutzerdefinierte Protokollierung, Abbruch des Workflows oder Beenden des Workflows. Im folgenden Beispiel wird ein Workflow aufgerufen, der eine Ausnahme auslöst. Die Ausnahme wird vom Workflow nicht behandelt, und der OnUnhandledException-Handler wird aufgerufen. Die WorkflowApplicationUnhandledExceptionEventArgs werden überprüft, um Informationen zur Ausnahme bereitzustellen, und der Workflow wird beendet.

Activity wf = new Sequence
{
    Activities =
     {
         new WriteLine
         {
             Text = "Starting the workflow."
         },
         new Throw
        {
            Exception = new InArgument<Exception>((env) => 
                new ApplicationException("Something unexpected happened."))
        },
        new WriteLine
         {
             Text = "Ending the workflow."
         }
     }
};

WorkflowApplication wfApp = new WorkflowApplication(wf);

wfApp.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
{
    // Display the unhandled exception.
    Console.WriteLine("OnUnhandledException in Workflow {0}\n{1}",
        e.InstanceId, e.UnhandledException.Message);

    Console.WriteLine("ExceptionSource: {0} - {1}",
        e.ExceptionSource.DisplayName, e.ExceptionSourceInstanceId);

    // Instruct the runtime to terminate the workflow.
    return UnhandledExceptionAction.Terminate;

    // Other choices are UnhandledExceptionAction.Abort and 
    // UnhandledExceptionAction.Cancel
};

wfApp.Run();

Behandeln von Ausnahmen mit der TryCatch-Aktivität

Zur Behandlung von Ausnahmen innerhalb eines Workflows dient die TryCatch-Aktivität. Die TryCatch-Aktivität verfügt über eine Catches-Auflistung von Catch-Aktivitäten, von denen jede einzelne einem bestimmten Exception-Typ zugeordnet ist. Wenn die Ausnahme, die von einer Aktivität im Try-Abschnitt einer TryCatch-Aktivität ausgelöst wurde, der Ausnahme einer Catch-Aktivität in der Catches-Auflistung entspricht, wird die Ausnahme behandelt. Wenn die Ausnahme explizit erneut ausgelöst wird oder eine neue Ausnahme ausgelöst wird, erfolgt die Übergabe dieser Ausnahme an die übergeordnete Aktivität. Die Aktivitäten im Finally-Abschnitt werden ausgeführt, wenn entweder der Try-Abschnitt oder der Catches-Abschnitt erfolgreich ausgeführt wurde. Das folgende Codebeispiel zeigt eine TryCatch-Aktivität, mit der eine ApplicationException-Ausnahme behandelt wird, die im Try-Abschnitt von einer Throw-Aktivität ausgelöst wurde. Die Meldung der Ausnahme wird von der Catch-Aktivität auf der Konsole ausgegeben. Anschließend wird eine Meldung im Finally-Abschnitt auf der Konsole ausgegeben.

DelegateInArgument<ApplicationException> ex = new DelegateInArgument<ApplicationException>()
{
    Name = "ex"
};

Activity wf = new TryCatch
{
    Try = new Throw()
    {
        Exception = new InArgument<Exception>((env) =>new ApplicationException("An ApplicationException was thrown."))
    },
    Catches = 
    {
        new Catch<ApplicationException>
        {
            Action = new ActivityAction<ApplicationException>
            {
                Argument = ex,
                Handler = new WriteLine()
                {
                    Text = new InArgument<string>((env) => ex.Get(env).Message)
                }
            }
        }
    },
    Finally = new WriteLine()
    {
        Text = "Executing in Finally."
    }
};

Ausnahmebehandlung und Kompensierung

Der Unterschied zwischen Ausnahmebehandlung und Kompensierung besteht darin, dass die Ausnahmebehandlung während der Ausführung einer Aktivität erfolgt. Die Kompensierung erfolgt, nachdem eine Aktivität erfolgreich abgeschlossen wurde. Die Ausnahmebehandlung bietet eine Möglichkeit, nach dem Auslösen der Ausnahme durch die Aktivität eine Bereinigung durchzuführen. Die Kompensierung dagegen stellt einen Mechanismus bereit, mit dem die erfolgreich abgeschlossene Arbeit einer zuvor abgeschlossenen Aktivität rückgängig gemacht werden kann. Weitere Informationen finden Sie unter Compensation Programming Model.

Siehe auch

Verweis

TryCatch
OnUnhandledException
CompensableActivity