0Pricing
Swift Academy · บทเรียน

try await และการส่งต่อข้อผิดพลาด

ใช้ try await กับฟังก์ชัน async ที่อาจส่งข้อผิดพลาด จัดการความล้มเหลวด้วย do/catch และส่งต่อข้อผิดพลาดขึ้นไปอย่างเป็นระเบียบ (รวมถึง CancellationError )

try await และการส่งต่อข้อผิดพลาด เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

เหตุใดจึงต้องลองรอผล

การลองรอผลใช้เรียกฟังก์ชันแบบไม่พร้อมกันที่อาจโยนข้อผิดพลาด หากฟังก์ชันนั้นโยนข้อผิดพลาด ข้อผิดพลาดจะถูกส่งต่อ เว้นแต่คุณจะดักจับไว้ คุณยังสามารถใช้ การลองแบบอาจไม่สำเร็จเพื่อแปลงผลลัพธ์เป็น ค่าทางเลือกได้

การทำงานแบบไม่พร้อมกันที่โยนข้อผิดพลาดและ do/catch

สร้างฟังก์ชันแบบไม่พร้อมกันที่โยนข้อผิดพลาด และเรียกใช้ด้วย การลองรอผลภายใน do/catch เพื่อจัดการกับความล้มเหลว

enum NetError: Error { case offline; case badStatus(Int) }

func fetchNumber(from ok: Bool) async throws -> Int {
    try await Task.sleep(nanoseconds: 100_000_000)
    if !ok { throw NetError.offline }
    return 7
}

Task {
    do {
        let n = try await fetchNumber(from: true)
        print("value:", n)          // 7
    } catch {
        print("failed:", error)     // handled here
    }
}

การแปลงข้อผิดพลาด

ใช้ การลองแบบอาจไม่สำเร็จเพื่อรับ ค่าทางเลือกแทนการโยนข้อผิดพลาด หลีกเลี่ยง การลองแบบบังคับสำเร็จ เว้นแต่คุณจะแน่ใจว่าจะไม่ล้มเหลว

Task {
    // try? converts failure to nil
    let maybe = try? await fetchNumber(from: false)
    print("optional result:", String(describing: maybe)) // nil on error

    // ⚠️ try! will crash if an error is thrown — avoid in production
    // let forced = try! await fetchNumber(from: false)
}

ส่งต่อข้อผิดพลาดขึ้นไป

กำหนดผู้เรียกใช้เป็น แบบไม่พร้อมกันและโยนข้อผิดพลาด เพื่อส่งต่อข้อผิดพลาดขึ้นไป โดยสามารถจัดการได้ที่ขอบเขตระดับสูงกว่า

func loadProfile(ok: Bool) async throws -> String {
    let id = try await fetchNumber(from: ok)   // propagate on error
    return "id:\\(id)"
}

Task {
    do {
        let s = try await loadProfile(ok: true)
        print(s) // "id:7"
    } catch {
        print("propagated:", error)
    }
}

การดักจับแบบเจาะจง

ใช้บล็อก ดักจับที่จับคู่รูปแบบ จัดการ CancellationError ก่อนเพื่อให้เส้นทางการปิดการทำงานรวดเร็วและไม่รบกวน

enum FileError: Error { case notFound }

func mightCancel() async throws {
    for _ in 0..<5 {
        try Task.checkCancellation()                 // throws CancellationError
        try await Task.sleep(nanoseconds: 30_000_000)
    }
}

Task {
    let t = Task { try await mightCancel() }
    t.cancel()
    do {
        try await t.value
    } catch is CancellationError {
        print("cancelled cleanly")                   // handle cancellation separately
    } catch {
        print("other error:", error)
    }
}

แนวทาง

เคล็ดลับ:

  • ส่งต่อด้วย try จนถึงขอบเขตที่สามารถตัดสินใจได้ เช่น ส่วนติดต่อผู้ใช้ CLI หรือ งานระดับบนสุด
  • ควรใช้ ข้อผิดพลาดเฉพาะโดเมน เช่น ชนิดแจกแจง เพื่อความชัดเจน
  • แปลงด้วย การลองแบบอาจไม่สำเร็จเฉพาะเมื่อยอมรับการไม่มีค่าได้
  • ดักจับ CancellationError แยกต่างหาก

การจัดการข้อผิดพลาดด้วยการลองรอผล

ตรวจสอบอย่างรวดเร็ว: try await f() จัดการกับข้อผิดพลาดอย่างไร

สรุปทบทวน

สรุปทบทวน: ใช้ การลองรอผลกับฟังก์ชันแบบไม่พร้อมกันที่โยนข้อผิดพลาด ส่งต่อข้อผิดพลาดจากฟังก์ชันช่วย แปลงด้วย การลองแบบอาจไม่สำเร็จเมื่อการไม่มีค่าเป็นสิ่งที่ยอมรับได้ และดักจับ CancellationErrorอย่างชัดเจน

คำถามที่พบบ่อย

บทเรียน “try await และการส่งต่อข้อผิดพลาด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “try await และการส่งต่อข้อผิดพลาด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “try await และการส่งต่อข้อผิดพลาด”

ใช้ try await กับฟังก์ชัน async ที่อาจส่งข้อผิดพลาด จัดการความล้มเหลวด้วย do/catch และส่งต่อข้อผิดพลาดขึ้นไปอย่างเป็นระเบียบ (รวมถึง CancellationError ) คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน

บทเรียน “try await และการส่งต่อข้อผิดพลาด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การทำงานพร้อมกันแบบมีโครงสร้างและฟังก์ชัน async
  2. async let, Task และการยกเลิก
  3. try await และการส่งต่อข้อผิดพลาด
← กลับไปที่ Swift Academy