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

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

ความล้มเหลวที่กู้คืนได้คือปัญหาที่นักพัฒนาแอปสามารถแก้ไขได้จากฝั่งของตน เช่น หากรหัสที่ใช้ในการเรียกไม่ถูกต้อง API จะแสดง HomeException พร้อมข้อความ invalid data จากนั้นนักพัฒนาแอปจะเลือกนำรหัสดังกล่าวออกจากแคชหรือแสดงข้อความแก่ผู้ใช้ เช่น "ไม่พบโครงสร้าง"

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

val result =
   try {
     homeManager.requestPermissions()
   } catch (e: HomeException) {
     PermissionsResult(
       PermissionsResultStatus.ERROR,
       "Got HomeException with error: ${e.message}",
     )
   }

เมธอดใดก็ตามใน Home API สามารถแสดง HomeException ได้ ดังนั้นเราขอแนะนำให้คุณใช้บล็อก try-catch เพื่อ ดักจับ HomeException ในการเรียกทั้งหมด

เมื่อจัดการ HomeException ให้ตรวจสอบฟิลด์ error.code และ error.message เพื่อดูว่าเกิดอะไรขึ้น นอกจากนี้ อาจมีรหัสข้อผิดพลาดย่อยด้วย ดังนั้นให้เรียกใช้เมธอด getSubErrorCodes() และตรวจสอบผลลัพธ์

Exception ที่ไม่ได้จัดการจะทำให้แอปขัดข้อง

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

ตาราง: HomeException รหัส
รหัส ความหมาย
ABORTED การดำเนินการถูกยกเลิก ซึ่งโดยปกติแล้วเกิดจากปัญหาการทำงานพร้อมกัน เช่น การตรวจสอบลำดับไม่สำเร็จหรือการยกเลิกธุรกรรม
ALREADY_EXISTS เอนทิตีที่ไคลเอ็นต์พยายามสร้าง เช่น ไฟล์ หรือไดเรกทอรี มีอยู่แล้ว
API_NOT_CONNECTED ไคลเอ็นต์พยายามเรียกใช้เมธอดจาก API ที่เชื่อมต่อไม่สำเร็จ ซึ่งอาจเกิดขึ้นเมื่ออุปกรณ์ออฟไลน์หรือไม่ รองรับ API ที่ไคลเอ็นต์พยายามเรียกใช้
CANCELLED การดำเนินการถูกยกเลิก ซึ่งโดยปกติแล้วเกิดจากผู้โทร
COMMAND_FAILED คำสั่งดำเนินการไม่สำเร็จ ดูรายละเอียดเพิ่มเติมได้ในรหัสข้อผิดพลาดย่อย
CURSOR_WINDOW_NOT_SUPPORTED มีการเรียกใช้เมธอดที่ใช้ CursorWindow แต่ CursorWindow ไม่ได้เปิดใช้หรือไม่ได้รับการรองรับใน บริบทปัจจุบัน
DATA_LOSS ข้อมูลสูญหายหรือเสียหายโดยกู้คืนไม่ได้
DEADLINE_EXCEEDED กำหนดเวลาหมดอายุก่อนที่การดำเนินการจะเสร็จสมบูรณ์ สำหรับการดำเนินการที่เปลี่ยนสถานะของระบบ ระบบอาจแสดงข้อผิดพลาดนี้แม้ว่าการดำเนินการจะเสร็จสมบูรณ์แล้วก็ตาม
DECOMMISSIONING_INELIGIBLE การเลิกใช้งานไม่สำเร็จเนื่องจากอุปกรณ์ไม่มีสิทธิ์เลิกใช้งาน
FAILED_PRECONDITION ระบบปฏิเสธการดำเนินการเนื่องจากระบบไม่ได้อยู่ในสถานะที่จำเป็นสำหรับการดำเนินการ เช่น คุณอาจได้รับ ข้อความนี้หากมีการเรียกใช้คำสั่ง stop ของ OvenCavityOperationalStateTrait ใน เตาอบที่หยุดทำงานแล้ว
INTERNAL ข้อผิดพลาดภายใน ซึ่งหมายความว่าระบบย่อยได้ละเมิดข้อกำหนดบางอย่างที่คาดไว้ รหัสข้อผิดพลาดนี้สงวนไว้สำหรับ ข้อผิดพลาดร้ายแรง
INVALID_ARGUMENT ไคลเอ็นต์ระบุอาร์กิวเมนต์ที่อยู่นอกช่วงค่าที่คาดไว้ของ ค่า
INVALID_DATA_HOLDER ตัวยึดข้อมูลไม่ถูกต้อง
NOT_FOUND ไม่พบเอนทิตีที่ขอ เช่น ไฟล์หรือไดเรกทอรี หากระบบปฏิเสธคำขอสำหรับผู้ใช้ทั้งคลาส เช่น การเปิดตัวฟีเจอร์แบบค่อยๆ หรือรายการที่อนุญาตพิเศษที่ไม่ได้บันทึกไว้ NOT_FOUND อาจใช้ หากระบบปฏิเสธคำขอสำหรับผู้ใช้บางรายในคลาสของผู้ใช้ เช่น การควบคุมการเข้าถึงตามผู้ใช้ PERMISSION_DENIED ต้องใช้
OUT_OF_RANGE มีการพยายามดำเนินการนอกช่วงที่ถูกต้อง เช่น การค้นหาหรือ การอ่านที่เกิน end-of-file ข้อผิดพลาดนี้แตกต่างจาก INVALID_ARGUMENT ตรงที่บ่งบอกถึงปัญหาที่อาจแก้ไขได้หากสถานะของระบบเปลี่ยนแปลง
PERMISSION_DENIED ผู้โทรไม่มีสิทธิ์ดำเนินการที่ระบุ PERMISSION_DENIED ห้ามใช้สำหรับการปฏิเสธที่เกิดจากการใช้ทรัพยากรบางอย่างจนหมด (ใช้ RESOURCE_EXHAUSTED สำหรับข้อผิดพลาดเหล่านั้น) PERMISSION_DENIED ต้องไม่ถูกใช้หากระบุตัวตนของผู้โทรไม่ได้ (ใช้ UNAUTHENTICATED สำหรับข้อผิดพลาดเหล่านั้น) รหัสข้อผิดพลาดนี้ไม่ได้หมายความว่าคำขอถูกต้องหรือเอนทิตีที่ขอมีอยู่หรือเป็นไปตามเงื่อนไขเบื้องต้นอื่นๆ
RESOURCE_EXHAUSTED ทรัพยากรบางอย่างหมดลงแล้ว ซึ่งอาจเป็นเพราะถึงโควต้าต่อผู้ใช้ หรือระบบไฟล์ทั้งหมดไม่มีพื้นที่เหลือ เช่น ระบบอาจแสดงข้อผิดพลาดนี้หากมีการเรียกใช้คำสั่ง dispense ของ DispenseTrait ในอุปกรณ์ให้อาหารสัตว์เลี้ยง แต่ไม่มีอาหารเหลืออยู่ในเครื่อง

นอกจากนี้ ยังอาจเกิดจากการเกินโควต้าโปรเจ็กต์ Home API ดูข้อมูลเพิ่มเติมได้ที่ การจัดการโควต้า
SDK_INITIALIZATION_MISSING_INFO มีการเริ่มต้น SDK โดยไม่มีข้อมูลที่จำเป็นทั้งหมด เช่น ระบบจะแสดงข้อผิดพลาดนี้หากไคลเอ็นต์พยายาม รับ TraitFactory สำหรับรหัสลักษณะที่กำหนด แต่ไม่ได้รวมลักษณะดังกล่าวไว้เมื่อเริ่มต้น SDK ดูหัวข้อ เริ่มต้นใช้งาน Home บน Android
UNAUTHENTICATED ระบุตัวตนของผู้โทรไม่ได้หรือคำขอไม่มีข้อมูลเข้าสู่ระบบการตรวจสอบสิทธิ์ที่ถูกต้อง
UNAVAILABLE บริการไม่พร้อมใช้งาน ซึ่งส่วนใหญ่แล้วเป็นสถานการณ์ชั่วคราว ที่แก้ไขได้โดยการลองอีกครั้งด้วยการหน่วงเวลา โปรดทราบว่า การลองการดำเนินการที่ไม่ใช่ Idempotent อีกครั้งอาจไม่ปลอดภัยเสมอไป
UNIMPLEMENTED บริการนี้ไม่ได้ใช้ ไม่รองรับ หรือไม่ได้เปิดใช้การดำเนินการที่ขอใน บริการนี้
UNKNOWN ข้อผิดพลาดที่ไม่รู้จัก UNKNOWN จะปรากฏขึ้นเมื่อเกิดสถานการณ์ข้อผิดพลาด ที่ไม่สามารถจัดประเภทโดยใช้รหัสข้อผิดพลาดอื่นๆ ได้ เช่น ระบบอาจแสดงข้อผิดพลาดนี้เมื่อค่าสถานะที่ได้รับ จาก API ภายนอกมีข้อมูลไม่เพียงพอ เกี่ยวกับสาเหตุหลัก
WRITE_FAILED การเขียนดำเนินการไม่สำเร็จ ดูรายละเอียดเพิ่มเติมได้ในรหัสข้อผิดพลาดย่อย