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