Поделиться через


Исключения

Данный раздел относится к версии Windows Workflow Foundation 4.

Рабочие процессы могут использовать действие TryCatch для обработки исключений, возникающих в ходе выполнения рабочего процесса. Эти исключения обрабатываются либо вызываются повторно при помощи действия Rethrow. Действия в разделе Finally выполняются при завершении либо раздела Try, либо раздела Catches. Рабочие процессы, размещаемые в экземпляре WorkflowApplication, также могут использовать обработчик событий OnUnhandledException для обработки исключений, которые не были обработаны действием TryCatch.

Причины исключений

В рабочем процессе исключения могут создаваться следующим образом.

  • Время ожидания транзакций в TransactionScope.

  • Явное исключение, вызываемое рабочим процессом с помощью действия Throw.

  • Исключение .NET Framework 4, возникшее из действия.

  • Исключение, возникающее из внешнего кода, например из библиотек, компонентов или служб, используемых в рабочем процессе.

Обработка исключений

Если исключение возникает из действия и не обрабатывается, поведение по умолчанию состоит в завершении экземпляра рабочего процесса. Если присутствует пользовательский обработчик OnUnhandledException, он может переопределить поведение по умолчанию. Обработчик предоставляет автору узла рабочего процесса возможность выполнить соответствующую обработку, например пользовательское протоколирование, прерывание, отмену или прекращение рабочего процесса. В следующем примере кода вызывается рабочий процесс, в котором создается исключение. Исключение не обрабатывается рабочим процессом, и вызывается обработчик OnUnhandledException. Чтобы получить сведения об исключении, проверяются аргументы WorkflowApplicationUnhandledExceptionEventArgs, и рабочий процесс завершается.

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

Обработка исключений при помощи действия TryCatch

Обработка исключений внутри рабочего процесса выполняется при помощи действия TryCatch. Действие TryCatch имеет коллекцию Catches действий Catch, из которых каждое связано с определенным типом Exception. Если исключение, возникшее из действия, содержащегося в разделе Try действия TryCatch, совпадает с исключением действия Catch в коллекции Catches, то исключение будет обработано. Если исключение возникает повторно явным образом или если возникает новое исключение, то это исключение передается родительскому действию. Действия в разделе Finally выполняются при успешном завершении либо раздела Try, либо раздела Catches. В следующем примере кода показано действие TryCatch, которое обрабатывает исключение ApplicationException, вызванное в разделе Try в результате действия Throw. Сообщение исключения записывается в консоль действием Catch, после чего сообщение выводится на консоль в разделе 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."
    }
};

Обработка исключений и компенсация

Отличие между обработкой исключений и компенсацией заключается в том, что обработка исключений имеет место во время выполнения действия. Компенсация имеет место после успешного завершения действия. Обработка исключений предоставляет возможность выполнить очистку после того, как действие вызывает исключение, в то время как компенсация обеспечивает механизм, с помощью которого можно отменить успешно завершенную работу ранее завершенного действия. Дополнительные сведения см. в разделе Compensation Programming Model.

См. также

Справочник

TryCatch
OnUnhandledException
CompensableActivity