Sdílet prostřednictvím


Výjimky Windows Workflow Foundation

Pracovní postupy mohou použít aktivitu TryCatch ke zpracování výjimek, které jsou vyvolány během provádění pracovního postupu. Tyto výjimky je možné zpracovat nebo je můžete znovu vyvolat pomocí aktivity Rethrow. Aktivity v oddílu Finally se provádějí po dokončení oddílu Try nebo Catches oddílu. Pracovní postupy hostované instancí WorkflowApplication mohou také použít obslužnou rutinu události OnUnhandledException ke zpracování výjimek, které nezpracovává aktivita TryCatch.

Příčiny výjimek

V pracovním postupu lze výjimky vygenerovat následujícími způsoby:

  • Časový limit transakcí v TransactionScope.

  • Explicitní výjimka vyvolaná pracovním postupem pomocí aktivity Throw.

  • Výjimka rozhraní .NET Framework 4.6.1 vyvolaná z aktivity

  • Výjimka vyvolaná z externího kódu, jako jsou knihovny, komponenty nebo služby používané v pracovním postupu.

Zpracování výjimek

Pokud aktivita vyvolá výjimku a neošetřená, výchozí chování je ukončit instanci pracovního postupu. Pokud je k dispozici vlastní obslužná rutina OnUnhandledException, může toto výchozí chování přepsat. Tato obslužná rutina dává hostiteli pracovního postupu příležitost poskytnout příslušné zpracování, jako je vlastní protokolování, přerušení pracovního postupu, zrušení pracovního postupu nebo ukončení pracovního postupu. Pokud pracovní postup vyvolá výjimku, která není zpracována, je vyvolána obslužná rutina OnUnhandledException. Z OnUnhandledException se vrátí tři možné akce, které určují konečný výsledek pracovního postupu.

  • Zrušit – Zrušená instance pracovního postupu je řádné ukončení spuštění větve. Chování zrušení můžete modelovat (například pomocí aktivity CancellationScope). Dokončená obslužná rutina je vyvolána po dokončení procesu zrušení. Zrušený pracovní postup je ve stavu Zrušeno.

  • Terminate – Ukončenou instanci pracovního postupu nelze obnovit ani restartovat. Tím se aktivuje událost Completed (Dokončeno), ve které můžete zadat výjimku z důvodu ukončení. Ukončená obslužná rutina se vyvolá po dokončení procesu ukončení. Ukončený pracovní postup je ve stavu Selhání.

  • přerušení – Přerušené instance pracovního postupu je možné obnovit pouze v případě, že byla nakonfigurovaná tak, aby byla trvalá. Bez trvalosti nelze pracovní postup obnovit. V okamžiku přerušení pracovního postupu dojde ke ztrátě všech provedených prací (v paměti) od posledního bodu trvalosti. U přerušeného pracovního postupu je obslužná rutina přerušena vyvolána pomocí výjimky jako důvod, kdy se proces přeruší. Na rozdíl od funkce Cancelled a Terminated však není vyvolána obslužná rutina Dokončeno. Přerušený pracovní postup je v přerušeném stavu.

Následující příklad vyvolá pracovní postup, který vyvolá výjimku. Výjimka je neošetřená pracovním postupem a je vyvolána obslužná rutina OnUnhandledException. WorkflowApplicationUnhandledExceptionEventArgs jsou kontrolovány, aby poskytovaly informace o výjimce a pracovní postup je ukončen.

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

Zpracování výjimek s aktivitou TryCatch

Zpracování výjimek uvnitř pracovního postupu se provádí s aktivitou TryCatch. Aktivita TryCatch obsahuje kolekci Catches aktivit Catch, které jsou přidružené ke konkrétnímu typu Exception. Pokud výjimka vyvolaná aktivitou obsaženou v oddílu Try aktivity TryCatch odpovídá výjimce Catch<TException> aktivity v kolekci Catches, zpracuje se výjimka. Pokud je výjimka explicitně znovu vyvolán nebo je vyvolán nová výjimka, předá tato výjimka nadřazené aktivitě. Následující příklad kódu ukazuje TryCatch aktivitu, která zpracovává ApplicationException, která je vyvolán v oddílu Try aktivitou Throw. Zpráva výjimky se zapíše do konzoly aktivitou Catch<TException> a pak se do konzoly zapíše zpráva v části 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."
    }
};

Aktivity v oddílu Finally se provádějí, když se úspěšně dokončí oddíl Try nebo Catches oddíl. Oddíl Try se úspěšně dokončí, pokud z něj nejsou vyvolány žádné výjimky, a oddíl Catches se úspěšně dokončí, pokud se z něj nevyvolají žádné výjimky nebo se z něj nevyvolají žádné výjimky. Pokud je v oddílu TryTryCatch vyvolá výjimka, která buď není zpracována Catch<TException> v Catches oddílu, nebo je znovu vyvolán z Catches, aktivity v Finally nebudou provedeny, pokud nedojde k některé z následujících akcí.

Zpracování výjimek versus kompenzace

Rozdíl mezi zpracováním výjimek a kompenzací spočívá v tom, že zpracování výjimek probíhá během provádění aktivity. Kompenzace nastane po úspěšném dokončení aktivity. Zpracování výjimek poskytuje příležitost vyčistit poté, co aktivita vyvolá výjimku, zatímco kompenzace poskytuje mechanismus, kterým lze úspěšně dokončenou práci dříve dokončené aktivity vrátit zpět. Další informace naleznete v tématu kompenzace.

Viz také