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