การจัดการข้อผิดพลาดใน 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 ให้ตรวจสอบฟิลด์ code และ message เพื่อดูว่าเกิดข้อผิดพลาดอะไรขึ้น

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

ตารางต่อไปนี้แสดงความหมายของรหัส HomeException ที่คุณอาจพบ

ตาราง: 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 ภายนอกมีข้อมูลไม่เพียงพอเกี่ยวกับสาเหตุ