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

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

ความล้มเหลวที่กู้คืนได้คือปัญหาที่นักพัฒนาแอปสามารถแก้ไขได้จากฝั่งของตนเอง เช่น หากรหัสที่ใช้ในการเรียกใช้ไม่ถูกต้อง 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() และตรวจสอบผลลัพธ์

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

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