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