Próbuję zawijać wyjątków, które mogą być zgłaszane przez zadanie async przy użyciu ContinueWith()
. Jeśli po prostu wyrzucę z działania kontynuacyjnego, rzeczy wydają się działać, ale mój debugger twierdzi, że wyjątek jest nieobsługiwany. Czy robię coś złego, czy jest to problem Visual Studio? Czy istnieje lepszy sposób na zrobienie tego, czy sposób obejścia mojego debuggera zatrzymujący się na tym, co jest ostatecznie obsługiwanym wyjątkiem?Wyrzucanie wyjątków z Kontynuuj
Poniższy test kończy się i drukuje "przechwycony wyjątek w opakowaniu zgodnie z oczekiwaniami", ale po debugowaniu linia throw new CustomException
wyświetla się jako "nieobsługiwana przez kod użytkownika".
var task = DoWorkAsync().ContinueWith(t => {
throw new CustomException("Wrapped", t.Exception.InnerException); // Debugger reports this unhandled
}, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously);
try {
task.Wait();
Assert.Fail("Expected work to fail");
} catch (AggregateException ag) {
if (!(ag.InnerException is CustomException))
throw;
}
Console.WriteLine("Caught wrapped exception as expected");
Kluczem tutaj jest masz dostępu do właściwości Exception (lub mieć wyjątek ponownie rzucony w ramach AggregateException poprzez dostęp właściwość Zadanie .Result (jeśli masz Zadanie ) ... –
DoWorkAsync() może rzucić kilka wyjątków, a ja po prostu próbuję je przetłumaczyć na kilka "CustomException" wyższego poziomu, które będą mniej kłopotliwe w obsłudze kodu wywołującego. aby całkowicie obsłużyć rzeczy teraz Więc szukam do przekształcenia nieudanego zadania w innym nie powiodło się zadanie , gdzie typ ex Cepcja jest inna. –
jtb
Jeśli rzucisz wyjątek CustomException, podsystem TPL po prostu zapakuje go w ten sam typ wyjątku AggregateException, który zawija wyjątek generowany z DoWorkAsync. –