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