Estoy tratando de ajustar las excepciones que puede lanzar una tarea asincrónica usando ContinueWith()
. Si acabo de lanzar desde la acción de continuación, las cosas parecen funcionar, pero mi depurador afirma que la excepción no se ha manejado. ¿Estoy haciendo algo mal o es este un problema de Visual Studio? ¿Hay alguna manera más clara de hacerlo, o una forma de evitar que mi depurador se detenga en lo que finalmente es una excepción manejada?Disparando excepciones de ContinueWith
La siguiente prueba pasa e imprime "excepción envuelta capturada como se esperaba", pero cuando la depuro la línea throw new CustomException
muestra como "no controlada por el código de usuario".
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");
clave aquí, es que hay que acceder a la propiedad de excepción (o tienen la excepción re-lanzada dentro de un AggregateException accediendo a la propiedad de tareas .Result (si tiene una tarea ) ... –
DoWorkAsync() puede arrojar un montón de excepciones diferentes, y estoy tratando de traducirlas a unos pocos niveles de "CustomException" que serán menos engorrosos de manejar en el código de llamada. Realmente no sé cómo para manejar completamente las cosas ahora. Así que estoy tratando de transformar una tarea fallida en otra tarea fallida donde el tipo de ex la recepción es diferente. –
jtb
Si lanza una excepción CustomException, el subsistema TPL simplemente ajustará eso en el mismo tipo de AggregateException que envolvería la excepción lanzada desde DoWorkAsync. –