es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  ,

Answer

  1. Avatar for 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:

    var results = [Widgets]()
    asyncStream: do {
        for try await items in asyncStream {
            do {
                results.append(contentsOf: items)
            } catch let error {
                // manejar el error, por ejemplo, actualizar la interfaz de usuario con un mensaje de error
                continue asyncStream // saltar a la siguiente iteración, ignorando el error
            }
        }
    }
    

    En este código, el bloque do-catch interno maneja el error y continúa con la siguiente iteración utilizando continue 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 array results 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 utilizar continue dentro de un bucle async.

Comments are closed.