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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การทำงานพร้อมกันแบบมีโครงสร้างและฟังก์ชัน async
- async let, Task และการยกเลิก
- try await และการส่งต่อข้อผิดพลาด