Estoy tratando de procesar algunas tareas de forma asincrónica con Rx, p. Ej.Cómo manejar excepciones de métodos asíncronos dentro de una instrucción SelectMany
var list = Enumerable.Range(0, 100)
.ToObservable()
.SelectMany(x => Observable.Start(() => {
Console.WriteLine("Processing {0} ...", x);
Thread.Sleep(100 * x % 3);
if (x > 90) {
Console.WriteLine("Procesing exception {0} > 90", x);
throw new Exception("Value too large");
}
Console.WriteLine("Processing {0} completed.", x);
return x;
}))
.Subscribe(
x => { Console.WriteLine("Next [{0}]", x); },
e => {
Console.WriteLine("Exception:");
Console.WriteLine(e.Message);
},
() => { Console.WriteLine("Complete"); }
);
El problema que tengo con este código es que la excepción no se pasa al suscriptor. Entonces, después de intentarlo, me rendí y decidí hacer esta simple pregunta:
¿Cómo se manejan las excepciones planteadas desde los métodos asíncronos dentro de una declaración SelectMany
?
Solo para dejarlo en claro, la implementación final es una llamada de función sincrónica que puede lanzar o no una excepción. El objetivo es pasarlo al suscriptor para que pueda seguir procesándolo (en el caso específico, un mensaje se mostrará al usuario).
Editar
Moví los hallazgos a una respuesta, de modo que pueda marcar esta pregunta como respondida. Personalmente, no estoy de acuerdo con mi propia respuesta ... pero a veces no hay otra manera, lo siento mucho.
¿Responde a esta pregunta? http: // stackoverflow.com/questions/7210051/catching-exceptions-which-may-be-throwwn-from-a-subscription-onnext-action – user981225
No exactamente como esto suprime la excepción, sin embargo, la idea emergente podría ser útil, si nada mejor entra Sin embargo, no estoy seguro de si el ajuste funcionará en mi escenario ya que estoy lidiando con múltiples llamadas asincrónicas y paralelas ... Pero investigaré, gracias. – AxelEckenberger
@ user981225, gracias valiosas, pero la respuesta es bastante simple, ver edición. – AxelEckenberger