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
ให้ตรวจสอบฟิลด์ code
และ message
เพื่อดูว่าเกิดข้อผิดพลาดใด
ข้อยกเว้นที่ไม่ได้จัดการจะทำให้แอปขัดข้อง
ตารางต่อไปนี้แสดงความหมายของรหัส HomeException
ที่คุณอาจพบ
รหัส | ความหมาย |
---|---|
ABORTED
| การดำเนินการถูกยกเลิก โดยปกติแล้วเนื่องจากปัญหาการทำงานพร้อมกัน เช่น การตรวจสอบลำดับไม่สำเร็จหรือการยกเลิกธุรกรรม |
ALREADY_EXISTS |
มีเอนทิตีที่ไคลเอ็นต์พยายามสร้างอยู่แล้ว เช่น ไฟล์ หรือไดเรกทอรี |
API_NOT_CONNECTED |
ไคลเอ็นต์พยายามเรียกใช้เมธอดจาก API ที่เชื่อมต่อไม่สำเร็จ ซึ่งอาจเกิดขึ้นเมื่ออุปกรณ์ออฟไลน์หรือ ไม่รองรับ API ที่ไคลเอ็นต์พยายามเรียกใช้ |
CANCELLED |
การดำเนินการถูกยกเลิก โดยปกติแล้วผู้โทรจะเป็นผู้ยกเลิก |
DATA_LOSS |
ข้อมูลสูญหายโดยกู้คืนไม่ได้หรือข้อมูลเสียหาย |
DEADLINE_EXCEEDED |
กำหนดเวลาหมดอายุก่อนที่การดำเนินการจะเสร็จสมบูรณ์ สำหรับการดำเนินการที่เปลี่ยนสถานะของระบบ ระบบอาจแสดงข้อผิดพลาดนี้แม้ว่าการดำเนินการจะเสร็จสมบูรณ์แล้วก็ตาม |
FAILED_PRECONDITION |
ระบบปฏิเสธการดำเนินการเนื่องจากระบบไม่ได้อยู่ในสถานะ
ที่จำเป็นสำหรับการดำเนินการ เช่น คุณอาจได้รับข้อความนี้หากมีการเรียกใช้คำสั่ง stop ของ OvenCavityOperationalStateTrait ในเตาอบที่หยุดทำงานแล้ว หรือหากคุณพยายามเรียกใช้การดำเนินการ rmdir ในรายการที่ไม่ใช่ไดเรกทอรี |
INTERNAL |
ข้อผิดพลาดภายใน ซึ่งหมายความว่าระบบพื้นฐานได้ละเมิดข้อกำหนดบางอย่างที่คาดไว้ รหัสข้อผิดพลาดนี้สงวนไว้สำหรับ ข้อผิดพลาดร้ายแรง |
INVALID_ARGUMENT |
ไคลเอ็นต์ระบุอาร์กิวเมนต์ที่อยู่นอกช่วงค่าที่คาดไว้ |
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 |
บริการไม่พร้อมใช้งาน ซึ่งมักเป็นเงื่อนไขชั่วคราว ที่แก้ไขได้โดยการลองอีกครั้งด้วยการหยุดชั่วคราว โปรดทราบว่า การลองดำเนินการที่ไม่ใช่แบบ Idempotent อีกครั้งอาจไม่ปลอดภัยเสมอไป |
UNIMPLEMENTED |
การดำเนินการที่ขอไม่ได้ใช้งาน ไม่รองรับ หรือไม่ได้เปิดใช้ใน บริการนี้ |
UNKNOWN |
ข้อผิดพลาดที่ไม่รู้จัก UNKNOWN จะปรากฏขึ้นเมื่อเกิดข้อผิดพลาด
ที่ไม่สามารถจัดประเภทโดยใช้รหัสข้อผิดพลาดอื่นๆ
เช่น ข้อผิดพลาดนี้อาจแสดงเมื่อค่าสถานะที่ได้รับ
จาก API ภายนอกมีข้อมูลไม่เพียงพอ
เกี่ยวกับสาเหตุที่แท้จริง |