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.

Swift 5: Error en el bloque de éxito o fracaso “El bloque ‘catch’ no es alcanzable porque no hay errores lanzados en el bloque ‘do'”.

Estoy escribiendo un cierre con manejo de errores, pero estoy recibiendo una advertencia de “bloque ‘catch’ es inaccesible porque no hay errores lanzados en el bloque ‘do'” en la línea de catch. Este es mi código:

class Servicio {
func graphQL(body: [String:Any], onSuccess: @escaping (Foundation.Data) -> (), onFailure: @escaping (Error) -> ()) {
    var request = URLRequest(url: url)

    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")

    request.httpBody = try? JSONSerialization.data(withJSONObject: body, options: .fragmentsAllowed)

    URLSession.shared.dataTask(with: request) { (data, response, error) in
        if let error = error {
            onFailure(error)
        }

        if let data = data {
            do{
                onSuccess(data)
            }
            catch{
                onFailure(error)
            }
        }
    }.resume()
}


class GestorPlazosFijos {
func getPlazosFijos(onSuccess: @escaping ([PlazoFijo]) -> (), onFailure: @escaping (Error) -> ()) {
    let body = ["query": "{ cuenta { plazosFijos { montoRetorno tasaInteres vencimiento montoOriginal id fechaInicio moneda } } }"
    ]

    Servicio().graphQL(body: body, onSuccess: { data in
        let json = try? JSONDecoder().decode(RespuestaGraphQL.self, from: data)
        onSuccess(json?.data?.cuenta?.plazosFijos ?? [])
    }, onFailure: { error in
        print(error)
    })
}

Quiero la lógica de onSuccess en la función getTimeDeposits(), ¿cómo remover esta advertencia de bloque catch?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para eliminar la advertencia “bloque catch es inalcanzable porque no hay errores lanzados en el bloque ‘do'”, debe mover el bloque try-catch fuera del bloque do.

    Aquí está el código actualizado:

    class Service {
        func graphQL(body: [String:Any], onSuccess: @escaping (Foundation.Data) -> (), onFailure: @escaping (Error) -> ()) {
            var request = URLRequest(url: url)
    
            request.httpMethod = "POST"
            request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    
            request.httpBody = try? JSONSerialization.data(withJSONObject: body, options: .fragmentsAllowed)
    
            URLSession.shared.dataTask(with: request) { (data, response, error) in
                if let error = error {
                    onFailure(error)
                }
    
                if let data = data {
                    do {
                        try onSuccess(data)
                    } catch {
                        onFailure(error)
                    }
                }
            }.resume()
        }
    }
    
    
    class TimeDepositManager {
        func getTimeDeposits(onSuccess: @escaping ([TimeDeposits]) -> (), onFailure: @escaping (Error) -> ()) {
            let body = ["query": "{ account { timeDeposits { returnAmount interestRate dueDate originalAmount id startDate currency } } }"]
    
            Service().graphQL(body: body, onSuccess: { data in
                do {
                    let json = try JSONDecoder().decode(GraphQLResponse.self, from: data)
                    onSuccess(json.data?.account?.timeDeposits ?? [])
                } catch {
                    onFailure(error)
                }
            }, onFailure: { error in
                print(error)
            })
        }
    }
    

    En el código actualizado, el bloque try-catch ahora se encuentra dentro del cierre onSuccess de la función graphQL. Esto permitirá que el bloque catch maneje cualquier error lanzado por el método JSONDecoder.decode().

Comments are closed.