Udostępnij za pośrednictwem


Wyjątki programu Windows Workflow Foundation

Przepływy pracy mogą używać TryCatch działania do obsługi wyjątków zgłaszanych podczas wykonywania przepływu pracy. Te wyjątki mogą być obsługiwane lub mogą zostać ponownie zgłoszone przy użyciu Rethrow działania. Działania w sekcji są wykonywane po zakończeniu FinallyTry sekcji lub Catches sekcji. Przepływy pracy hostowane przez WorkflowApplication wystąpienie mogą również obsługiwać OnUnhandledException wyjątki, które nie są obsługiwane przez TryCatch działanie.

Przyczyny wyjątków

W przepływie pracy można wygenerować wyjątki w następujący sposób:

  • Limit czasu transakcji w programie TransactionScope.

  • Jawny wyjątek zgłaszany przez przepływ pracy przy użyciu Throw działania.

  • Wyjątek .NET Framework 4.6.1 zgłoszony z działania.

  • Wyjątek zgłoszony z kodu zewnętrznego, taki jak biblioteki, składniki lub usługi używane w przepływie pracy.

Obsługa wyjątków

Jeśli wyjątek jest zgłaszany przez działanie i jest nieobsługiwany, domyślnym zachowaniem jest zakończenie wystąpienia przepływu pracy. Jeśli istnieje program obsługi niestandardowej OnUnhandledException , może zastąpić to domyślne zachowanie. Ta procedura obsługi umożliwia tworzenie hosta przepływu pracy w celu zapewnienia odpowiedniej obsługi, takiej jak rejestrowanie niestandardowe, przerwanie przepływu pracy, anulowanie przepływu pracy lub zakończenie przepływu pracy. Jeśli przepływ pracy zgłasza wyjątek, który nie jest obsługiwany, OnUnhandledException zostanie wywołana procedura obsługi. Istnieją trzy możliwe akcje zwrócone, z OnUnhandledException których zależy ostateczny wynik przepływu pracy.

  • Anuluj — anulowane wystąpienie przepływu pracy to bezproblemowe zakończenie wykonywania gałęzi. Możesz modelować zachowanie anulowania (na przykład przy użyciu działania CancellationScope). Ukończona procedura obsługi jest wywoływana po zakończeniu procesu anulowania. Anulowany przepływ pracy jest w stanie Anulowane.

  • Zakończenie — nie można wznowić ani ponownie uruchomić zakończonego wystąpienia przepływu pracy. Spowoduje to wyzwolenie zdarzenia Ukończone, w którym można podać wyjątek jako przyczynę jego zakończenia. Procedura obsługi zakończonej jest wywoływana po zakończeniu procesu zakończenia. Zakończony przepływ pracy jest w stanie Błędy.

  • Przerwanie — przerwane wystąpienia przepływu pracy można wznowić tylko wtedy, gdy skonfigurowano je jako trwałe. Bez trwałości nie można wznowić przepływu pracy. W momencie przerwania przepływu pracy zostanie przerwana każda praca wykonana (w pamięci) od momentu utraty ostatniego punktu trwałości. W przypadku przerwanego przepływu pracy przerwany program obsługi jest wywoływany przy użyciu wyjątku jako przyczyny zakończenia procesu przerwania. Jednak w przeciwieństwie do anulowanych i zakończonych, procedura obsługi Ukończona nie jest wywoływana. Przerwany przepływ pracy jest w stanie przerwanym.

Poniższy przykład wywołuje przepływ pracy, który zgłasza wyjątek. Wyjątek jest nieobsługiwany przez przepływ pracy, a OnUnhandledException procedura obsługi jest wywoływana. Są WorkflowApplicationUnhandledExceptionEventArgs sprawdzane w celu podania informacji o wyjątku, a przepływ pracy został zakończony.

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();

Obsługa wyjątków za pomocą działania TryCatch

Obsługa wyjątków wewnątrz przepływu pracy jest wykonywana z działaniem TryCatch . Działanie TryCatch ma Catches kolekcję Catch działań, które są skojarzone z określonym Exception typem. Jeśli wyjątek zgłaszany przez działanie zawarte w Try sekcji TryCatch działania jest zgodny z wyjątkiem Catch<TException> działania w Catches kolekcji, zostanie obsłużony wyjątek. Jeśli wyjątek zostanie jawnie zgłoszony ponownie lub zostanie zgłoszony nowy wyjątek, ten wyjątek przechodzi do działania nadrzędnego. Poniższy przykład kodu przedstawia TryCatch działanie, które obsługuje ApplicationException element zgłaszany w Try sekcji przez Throw działanie. Komunikat wyjątku jest zapisywany w konsoli przez Catch<TException> działanie, a następnie komunikat jest zapisywany w konsoli w Finally sekcji.

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."
    }
};

Działania w sekcji są wykonywane po pomyślnym zakończeniu FinallyTry sekcji lub Catches sekcji. Sekcja Try została pomyślnie ukończona, jeśli nie zostaną z niego zgłoszone żadne wyjątki, a Catches sekcja zostanie pomyślnie ukończona, jeśli nie zostaną zgłoszone żadne wyjątki lub zostaną z niego ponownie wyrzucone. Jeśli wyjątek jest zgłaszany w Try sekcji elementu TryCatch i nie jest obsługiwany przez element Catch<TException> w Catches sekcji lub zostanie ponownie wyrzucony z Catcheselementu , działania w Finally obiekcie nie zostaną wykonane, chyba że wystąpi jeden z poniższych.

Obsługa wyjątków a rekompensata

Różnica między obsługą wyjątków a rekompensatą polega na tym, że obsługa wyjątków odbywa się podczas wykonywania działania. Rekompensata występuje po pomyślnym zakończeniu działania. Obsługa wyjątków zapewnia możliwość oczyszczenia po wystąpieniu wyjątku, podczas gdy rekompensata zapewnia mechanizm, za pomocą którego można cofnąć pomyślnie ukończoną pracę wcześniej ukończonego działania. Aby uzyskać więcej informacji, zobacz Rekompensata.

Zobacz też