Fonction de gestion des erreurs

0

La question

Je ne comprends pas à partir de la documentation comment faire l'erreur de manipulation, j'ai le texte suivant:

func myFunc() async -> TransactionsClassAModel {
    let url = URL(string: "..."))
    
    let undecodedData = try! await networkingTools.afRequest(url: url!)
    let decodedData = try! JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
    
    return decodedData
}

J'ai essayé quelque chose comme:

do {
    let undecodedData = try await networkingTools.afRequest(url: url!)
    try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
} catch {
    print("error: ", error)
}

et l'instruction return dit Cannot find 'decodedData' in scope et un avertissement: Result of call to 'decode(_:from:)' is unused

Quelqu'un peut-il m'expliquer comment cela fonctionne s'il vous plaît.

Merci

swift
2021-11-23 20:30:01
1

La meilleure réponse

0

La solution la plus simple est de créer un do bloc, à partir de laquelle vous retour si tout va bien. Et un bloc catch qui va se passer si quelque chose va mal. Vous devez également ajuster votre signature de fonction de retour de valeur facultative, puisqu'en cas d'échec, vous ne sera probablement pas avoir une TransactionsClassAModel:

func myFunc() async -> TransactionsClassAModel? {

    let url = URL(string: "...")

    do {

        let undecodedData = try await networkingTools.afRequest(url: url!)
        let decodedData = try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
        /* do anything you need */
        return decodedData // success
    } catch {
        print(error)
        return nil // no object in this case
    }
}

vous pouvez également les blocs distincts, de sorte que chaque essai est dans son propre bloc, par exemple:

func myFunc() async -> TransactionsClassAModel? {

    let url = URL(string: "...")

    var undecodedData: Data // or optional Data? if function can return nil
    do {
        let undecodedData = try await networkingTools.afRequest(url: url!)
    } catch {
        print("Failed in afReqest: \(error)")
        return nil
    }

    var decodedData: TransactionClassModel?
    do {
        decodedData = try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
    } catch {
        print("Failed in decode: \(error)")
        return nil
    }
    return decodedData
}

Vous pouvez aussi séparer le décodage des données en fonction privée, et de retour sur appel de la fonction:

private func decodeMyData(_ undecodedData; Data) -> TransactionsClassAModel? {
    do {
        return try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
    } catch {
        print("Failed in decode: \(error)")
        return nil
    }
}

func myFunc() async -> TransactionsClassAModel? {

    let url = URL(string: "...")

    do {
        let undecodedData = try await networkingTools.afRequest(url: url!)
        return decodeMyData(undecodedData)
    } catch {
        print("Failed in afReqest: \(error)")
        return nil
    }
}
2021-11-23 23:01:03

ohhhh sorte que le retour se passe à l'intérieur de l'attraper ainsi! Beaucoup d'exemples dans cette réponse, grâce à vous!! L'étude de ce que j'écris ceci.
Albert

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................