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