การจัดการฟังก์ชันข้อผิดพลาด

0

คำถาม

ฉันไม่เข้าใจเลยจากเอกสารคู่มือวิธีที่จะทำที่เกิดข้อผิดพลาดการจัดการฉันต้องต่อไปนี้:

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
}

ฉันพยายามอย่าง:

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

และกลับไปแถลงการณ์บอกว่า Cannot find 'decodedData' in scope และคำเตือน: Result of call to 'decode(_:from:)' is unused

ใครก็ได้อธิบายว่ามันทำงานได้โปรด

ขอบคุณ

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

คำตอบที่ดีที่สุด

0

คนงานง่ายสุดซ่อมคือการสร้างหนึ่ง do บล็อคจากที่คุณกลับมาถ้าทุกอย่างเรียบร้อยดี และหนึ่งบล็อกจับซึ่งจะเกิดขึ้นถ้ามีอะไรผิดปกติ. คุณยังต้องปรับตัวของคุณฟังก์ชันลายเซ็นเพื่อกลับตัวเลือกค่าตั้งแต่ในกรณีของความล้มเหลวคุณอาจจะไม่มี 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
    }
}

คุณยังสามารถแยกออกช่วงตึกดังนั้นกันและพยายามเป็นอยู่ในตัวของมันเองบริเวณแถวนั้นแล้ว e.g.:

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
}

คุณยังสามารถแยกข้อมูลการถอดรหัสในส่วนตัวฟังก์ชันและกลับมาอยู่นั่นเรียกฟังก์ชัน:

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 ดังนั้นกลับไปข้างในจับเช่นกัน! หลายของตัวอย่างในคำตอบขอบคุณคุณ!! ศึกษามันอย่างที่ฉันเขียนเรื่องนี้
Albert

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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