Výjimky Windows Workflow Foundation
Pracovní postupy mohou aktivitu používat 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 znovu vyvolat pomocí Rethrow aktivity . Aktivity v oddílu Finally se spouštějí po dokončení oddílu Try nebo oddílu Catches . Pracovní postupy hostované WorkflowApplication instancí mohou také používat obslužnou rutinu OnUnhandledException události ke zpracování výjimek, které nejsou zpracovávány aktivitou TryCatch .
Příčiny výjimek
V pracovním postupu lze výjimky generovat následujícími způsoby:
Časový limit transakcí v TransactionScope.
Explicitní výjimka vyvolaná pracovním postupem pomocí Throw aktivity.
Výjimka rozhraní .NET Framework 4.6.1 vyvolaná z aktivity.
Výjimka vyvolaná externím kódem, jako jsou knihovny, komponenty nebo služby, které se používají v pracovním postupu.
Zpracování výjimek
Pokud je výjimka vyvolán aktivitou a je neošetřená, výchozím chováním je ukončení instance pracovního postupu. Pokud je k dispozici vlastní OnUnhandledException obslužná rutina, může toto výchozí chování přepsat. Tato obslužná rutina dává autorovi pracovního postupu příležitost poskytnout odpovídající 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, OnUnhandledException je vyvolána obslužná rutina. Vrácené jsou tři možné akce, které OnUnhandledException určují konečný výsledek pracovního postupu.
Zrušit – Zrušená instance pracovního postupu je řádné ukončení provádění větve. Chování zrušení můžete modelovat (například pomocí aktivity CancellationScope). Obslužná rutina Completed je vyvolána po dokončení procesu zrušení. Zrušený pracovní postup je ve stavu Zrušeno.
Ukončit – 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 jako důvod ukončení. Obslužná rutina Terminated je vyvolána při dokončení procesu ukončení. Ukončený pracovní postup je ve stavu Chybný.
Přerušit – přerušené instance pracovního postupu je možné obnovit pouze v případě, že byly nakonfigurovány jako trvalé. Pracovní postup nelze bez trvalosti obnovit. V okamžiku přerušení pracovního postupu dojde ke ztrátě všech prací provedených (v paměti) od posledního bodu trvalosti. U přerušeného pracovního postupu je vyvolána obslužná rutina Přerušeno s použitím výjimky jako důvodu, kdy se proces přeruší. Na rozdíl od zrušeno a ukončeno však není vyvolána obslužná rutina Completed. Přerušený pracovní postup je ve stavu Přerušeno.
Následující příklad vyvolá pracovní postup, který vyvolá výjimku. Výjimka je neošetřena pracovním postupem a obslužná OnUnhandledException rutina je vyvolána. Jsou WorkflowApplicationUnhandledExceptionEventArgs 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 {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();
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 CatchesCatch aktivit, z nichž každá je přidružená ke konkrétnímu Exception typu. Pokud výjimka vyvolaná aktivitou obsaženou v Try oddílu TryCatch aktivity odpovídá výjimce Catch<TException> aktivity v kolekci Catches , je výjimka zpracována. Pokud je výjimka explicitně znovu vyvolán nebo je vyvolán nová výjimka, pak se tato výjimka předá nadřazené aktivitě. Následující příklad kódu ukazuje TryCatch aktivitu, která zpracovává objekt ApplicationException , který je vyvolán v Try oddílu aktivitou Throw . Zpráva o výjimce se zapíše do konzoly aktivitou Catch<TException> a pak se zpráva zapíše do konzoly v oddílu 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 spustí po úspěšném dokončení oddílu Try nebo oddílu Catches . Oddíl se Try úspěšně dokončí, pokud se z něj nevyvolají žádné výjimky, a Catches pokud se z něj nevyvolají nebo se z něj nevyvolají žádné výjimky, úspěšně se dokončí. Pokud je vyvolán výjimka v Try oddílu objektu TryCatch a buď není zpracována objektem Catch<TException> v oddílu Catches , nebo je opětovně vyvolán z objektu Catches, aktivity v objektu nebudou Finally provedeny, pokud nedojde k jedné z následujících akcí.
Výjimka je zachycena aktivitou vyšší úrovně TryCatch v pracovním postupu, bez ohledu na to, zda je obnovena z této vyšší úrovně TryCatch.
Výjimka není zpracována vyšší úrovní TryCatch, uniká do kořenového adresáře pracovního postupu a pracovní postup je nakonfigurován tak, aby se zrušil místo ukončení nebo přerušení. Pracovní postupy hostované pomocí WorkflowApplication můžou toto nastavení nakonfigurovat tak, že zpracovávají OnUnhandledException a vrací Cancel. Příklad zpracování OnUnhandledException je uveden dříve v tomto tématu. Služby pracovních postupů to můžou nakonfigurovat pomocí WorkflowUnhandledExceptionBehavior a zadáním Cancel. Příklad konfigurace WorkflowUnhandledExceptionBehaviornajdete v tématu Rozšiřitelnost hostitele služby pracovního postupu.
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, pomocí kterého lze úspěšně dokončenou práci dříve dokončené aktivity vrátit zpět. Další informace najdete v tématu Kompenzace.