การจัดการข้อผิดพลาด

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