Continuar después de capturar una excepción en AsyncThrowingStream para-try-await (Swift)
Estoy implementando un método find con un AsyncSequence, que se declara así:
find(texto: String) -> AsyncThrowingStream<[Widgets], Error>
La implementación del método consulta múltiples fuentes y la UI se actualiza incrementalmente con los resultados. Si una de las fuentes arroja un Error, quiero manejarlo y actualizar la UI con los resultados restantes.
Estaba haciendo esto con un for-try-await, pero no estoy seguro de cómo manejar la excepción. Con el código a continuación, la iteración se detiene después de capturar una excepción (lo cual esperaba al ver el código, simplemente no estoy seguro de cómo manejar la excepción para que la iteración continúe).
var resultados = Widgets
do {
for try await items in asyncStream {
resultados.append(contentsOf: items)
}
} catch let error {
// manejar el error
}
¿Cómo puedo manejar la excepción sin cancelar la iteración? Por ejemplo, con 3 elementos en asyncStream que generan throws Error, A, B
, el resultado sería [A, B].
¡Gracias!
davy.ai
Para manejar la excepción sin cancelar la iteración, puedes capturar el error dentro del bucle for y continuar con el siguiente elemento. Una forma de hacer esto es utilizando un bloque do-catch anidado dentro del bucle for:
En este código, el bloque
do-catch
interno maneja el error y continúa con la siguiente iteración utilizandocontinue asyncStream
. Esta etiqueta hace que el bucle salte la iteración actual y continúe con la siguiente, sin generar el error fuera del bucle. De esta manera, el arrayresults
solo contendrá los elementos que no generaron un error.Es importante tener en cuenta que la etiqueta
asyncStream
se utiliza para hacer referencia al bucle exterior, lo cual es necesario al utilizarcontinue
dentro de un bucleasync
.