Obsługa błędów funkcji

0

Pytanie

Nie rozumiem z dokumentacji, jak wykonać obsługę błędów, mam następujący:

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
}

Próbowałem coś takiego:

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

i w oświadczeniu o zwrocie czytamy: Cannot find 'decodedData' in scope i ostrzeżenie: Result of call to 'decode(_:from:)' is unused

Może mi ktoś wytłumaczyć, jak to działa, proszę.

Dziękuję

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

Najlepsza odpowiedź

0

Najprostsze poprawka-to utworzyć jeden do blok, z którego wrócisz, jeśli wszystko będzie w porządku. I jeden blok catch, który się stanie, jeśli coś pójdzie nie tak. Trzeba także ustawić sygnaturę funkcji, aby zwracać opcjonalna wartość, tak jak w przypadku awarii u ciebie prawdopodobnie nie będzie 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
    }
}

można również dzielić się bloki, więc każda próba jest w swoim własnym bloku, na przykład:

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
}

Można również podzielić dekodowanie danych na prywatnej funkcję i powrócić do połączenia tej funkcji:

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

oooo, to znaczy, że powrót też idzie do połowu! Wiele przykładów w tej odpowiedzi, dziękuję!! Uczę się go, gdy piszę to.
Albert

W innych językach

Ta strona jest w innych językach

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