Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przepływy pracy mogą używać działania TryCatch do obsługi wyjątków zgłaszanych podczas wykonywania przepływu pracy. Te wyjątki można obsłużyć lub mogą zostać ponownie zgłoszone przy użyciu działania Rethrow. Działania w sekcji Finally są wykonywane po zakończeniu sekcji Try lub sekcji Catches. Przepływy pracy hostowane przez wystąpienie WorkflowApplication mogą również używać programu obsługi zdarzeń OnUnhandledException do obsługi wyjątków, które nie są obsługiwane przez działanie TryCatch.
Przyczyny wyjątków
W przepływie pracy wyjątki można wygenerować w następujący sposób:
Limit czasu transakcji w TransactionScope.
Jawny wyjątek zgłaszany przez przepływ pracy przy użyciu działania Throw.
Zgłoszony wyjątek programu .NET Framework 4.6.1 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 niestandardowy program obsługi OnUnhandledException, może on zastąpić to zachowanie domyślne. Ta procedura obsługi daje autorowi przepływu pracy możliwość zapewnienia odpowiedniej obsługi, takiej jak rejestrowanie niestandardowe, przerywanie przepływu pracy, anulowanie przepływu pracy lub kończenie przepływu pracy. Jeśli przepływ pracy zgłasza wyjątek, który nie jest obsługiwany, wywoływany jest program obsługi OnUnhandledException. Istnieją trzy możliwe akcje zwrócone z OnUnhandledException, które określają 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 za pomocą działania CancellationScope). Ukończona procedura obsługi jest wywoływana po zakończeniu procesu anulowania. Anulowany przepływ pracy jest w stanie Anulowano.
Zakończ — 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. Zakończony program obsługi jest wywoływany po zakończeniu procesu kończenia. Zakończony przepływ pracy jest w stanie Błąd.
przerwać — 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 wszystkie zadania wykonywane (w pamięci) od ostatniego punktu trwałości zostaną utracone. 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ńczonej 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 nie jest obsługiwane przez przepływ pracy, a program obsługi OnUnhandledException jest wywoływany. WorkflowApplicationUnhandledExceptionEventArgs są sprawdzane w celu dostarczenia informacji o wyjątku, a przepływ pracy zostanie 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 {e.InstanceId}\n{e.UnhandledException.Message}");
Console.WriteLine($"ExceptionSource: {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 za pomocą działania TryCatch. Działanie TryCatch ma kolekcję Catches działań Catch, które są skojarzone z określonym typem Exception. Jeśli wyjątek zgłoszony przez działanie zawarte w sekcji Try działania TryCatch jest zgodny z wyjątkiem działania Catch<TException> w kolekcji Catches, jest obsługiwany wyjątek. Jeśli wyjątek jest jawnie zgłaszany ponownie lub zgłaszany jest nowy wyjątek, ten wyjątek przechodzi do działania nadrzędnego. Poniższy przykład kodu przedstawia działanie TryCatch obsługujące ApplicationException, które jest zgłaszane w sekcji Try przez działanie Throw. Komunikat wyjątku jest zapisywany w konsoli przez działanie Catch<TException>, a następnie komunikat jest zapisywany w konsoli w sekcji Finally.
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 Finally są wykonywane po pomyślnym zakończeniu sekcji Try lub sekcji Catches. Sekcja Try zostanie pomyślnie ukończona, jeśli nie zostaną wyrzucone żadne wyjątki, a sekcja Catches zostanie pomyślnie ukończona, jeśli nie zostaną zgłoszone wyjątki lub ponownie zostaną z niego wyrzucone. Jeśli wyjątek jest zgłaszany w sekcji TryTryCatch i nie jest obsługiwany przez Catch<TException> w sekcji Catches lub jest przywracany z Catches, działania w Finally nie zostaną wykonane, chyba że wystąpi jeden z poniższych.
Wyjątek jest przechwytywane przez działanie wyższego poziomu TryCatch w przepływie pracy, niezależnie od tego, czy jest on ponownie zwracany z tego wyższego poziomu TryCatch.
Wyjątek nie jest obsługiwany przez wyższy poziom TryCatch, wyłącza katalog główny przepływu pracy, a przepływ pracy jest skonfigurowany do anulowania zamiast przerwania lub przerwania. Przepływy pracy hostowane przy użyciu WorkflowApplication mogą to skonfigurować, obsługując OnUnhandledException i zwracając Cancel. W tym temacie przedstawiono przykład obsługi OnUnhandledException. Usługi przepływu pracy mogą to skonfigurować przy użyciu WorkflowUnhandledExceptionBehavior i określania Cancel. Aby zapoznać się z przykładem konfigurowania WorkflowUnhandledExceptionBehavior, zobacz Rozszerzalność hosta usługi przepływu pracy.
Obsługa wyjątków a rekompensata
Różnica między obsługą wyjątków a kompensacją polega na tym, że obsługa wyjątków występuje podczas wykonywania działania. Rekompensata występuje po pomyślnym zakończeniu działania. Obsługa wyjątków umożliwia oczyszczenie po wystąpieniu wyjątku, natomiast 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 Compensation.