การจัดการข้อผิดพลาดใน iOS

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

ตัวอย่างวิธีจัดการกับความล้มเหลวที่กู้คืนได้มีดังนี้

    let light1 = lightDevices.first
    if let light = light1 {
    do {
      try await structure.move(device: light, to: room)
    } catch let error as HomeError {
      // Code for handling the exception
    }

ตารางต่อไปนี้แสดงความหมายของรหัส HomeError ที่คุณอาจพบ

ตาราง: รหัส HomeError
รหัส ความหมาย
aborted ล้มเลิกการดำเนินการแล้ว โดยปกติแล้ว ข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อมีปัญหาการเกิดขึ้นพร้อมกัน เช่น การตรวจสอบลำดับล้มเหลวหรือการยกเลิกธุรกรรม
alreadyExists มีทรัพยากรหรือเอนทิตีที่คุณพยายามสร้างอยู่แล้ว ตัวอย่างเช่น กำหนดเวลาที่มีชื่อสำหรับตัวควบคุมอุณหภูมิ
cancelled การดำเนินการถูกยกเลิก โดยปกติแล้วจะยกเลิกโดยผู้โทร
dataLoss ข้อมูลรั่วไหลหรือเสียหายแบบกู้คืนไม่ได้
deadlineExceeded กำหนดเวลาหมดอายุก่อนที่การดำเนินการจะเสร็จสมบูรณ์ สำหรับการดำเนินการที่เปลี่ยนสถานะของระบบ ระบบอาจแสดงข้อผิดพลาดนี้แม้ว่าการดำเนินการจะเสร็จสมบูรณ์แล้วก็ตาม ตัวอย่างเช่น การตอบกลับที่สำเร็จจากเซิร์ฟเวอร์อาจล่าช้านานพอที่จะทำให้กำหนดเวลาหมดอายุ
failedPrecondition การดำเนินการถูกปฏิเสธเนื่องจากระบบไม่ได้อยู่ในสถานะที่จำเป็นสำหรับการดำเนินการ เช่น คุณอาจได้รับข้อความนี้หากพูดว่า stop กับเตาอบที่หยุดทำงานแล้ว
internal ข้อผิดพลาดภายใน ซึ่งหมายความว่าค่าคงที่บางค่าที่ระบบพื้นฐานคาดไว้เสียหาย รหัสข้อผิดพลาดนี้สงวนไว้สำหรับข้อผิดพลาดร้ายแรง
invalidArgument ไคลเอ็นต์ระบุอาร์กิวเมนต์ที่ไม่ถูกต้อง โปรดทราบว่าข้อผิดพลาดนี้แตกต่างจาก `failedPrecondition` โดย `invalidArgument` จะระบุอาร์กิวเมนต์ที่เป็นปัญหาไม่ว่าระบบจะอยู่ในสถานะใดก็ตาม (เช่น ชื่อไฟล์ที่มีรูปแบบไม่ถูกต้อง)
notFound คุณระบุเอนทิตีหรือทรัพยากรที่ไม่พบ เช่น การระบุรหัสแทร็กที่ไม่มีอยู่เมื่อเรียกใช้ play บนอุปกรณ์มีเดียเพลเยอร์
outOfRange พารามิเตอร์เกินช่วงที่ถูกต้อง โดยอิงตามสถานะปัจจุบันของระบบ ข้อความนี้จะปรากฏขึ้นเมื่อค่าอยู่ในช่วงของค่าที่การเรียก API อาจยอมรับได้ แต่ไม่สมเหตุสมผลในบริบทปัจจุบัน
permissionDenied คุณไม่มีสิทธิ์ดำเนินการตามที่ระบุ ไม่ควรตีความรหัสข้อผิดพลาดนี้ว่าคำขอถูกต้อง
resourceExhausted ทรัพยากรบางอย่างหมดแล้ว ตัวอย่างเช่น ข้อผิดพลาดนี้อาจแสดงขึ้นเมื่อมีคนเรียกใช้ dispense(item:amount:unit:presetName:) ในอุปกรณ์เครื่องให้อาหารสัตว์เลี้ยงและไม่มีอาหารเหลืออยู่ในเครื่องแล้ว

ซึ่งอาจเกิดจากการใช้โควต้าโปรเจ็กต์ Home API เกินขีดจำกัดด้วย ดูข้อมูลเพิ่มเติมได้ที่การจัดการโควต้า
unauthenticated ไม่สามารถระบุผู้โทรหรือคำขอไม่มีข้อมูลรับรองการตรวจสอบสิทธิ์ที่ถูกต้อง
unavailable บริการไม่พร้อมใช้งาน ซึ่งน่าจะเป็นสภาวะชั่วคราวที่แก้ไขได้โดยการลองใหม่ด้วย Backoff โปรดทราบว่าการลองดำเนินการที่ไม่ใช่ Idempotent อีกครั้งอาจไม่ปลอดภัยเสมอไป
unimplemented การดำเนินการที่ขอไม่ได้ติดตั้งใช้งาน ไม่รองรับ หรือไม่ได้เปิดใช้ในบริการนี้
unknown ข้อผิดพลาดที่ไม่รู้จัก โดยทั่วไป unknown จะปรากฏขึ้นเมื่อเกิดข้อผิดพลาดที่ไม่สามารถจัดประเภทโดยใช้รหัสข้อผิดพลาดอื่นๆ ตัวอย่างเช่น ระบบอาจแสดงข้อผิดพลาดนี้เมื่อค่าสถานะที่ได้รับจาก API ภายนอกมีข้อมูลไม่เพียงพอเกี่ยวกับสาเหตุของปัญหา