טיפול בשגיאות ב-Android

‫Kotlin לא תומכת בחריגים מסוג checked. כך אפשר לפשט ולייעל את הטיפול בשגיאות, כי אפשר לבחור לטפל רק בחריגים שאפשר לתקן. בנוסף, מכיוון שלא צריך לטפל באופן מפורש בכל חריגה אפשרית, הקוד פחות עמוס ונשאר ממוקד במטרה העיקרית שלו.

כשלים שניתן לתקן הם בעיות שמפתח יכול לטפל בהן מהצד שלו. לדוגמה, אם מזהה שמשמש בקריאה לא תקין, ה-API מחזיר HomeException עם הודעה invalid data. מפתח האפליקציה יכול לבחור אם להסיר את המזהה הזה מהמטמון שלו או להציג למשתמש הודעה כמו 'לא נמצאה מבנה'.

דוגמה לאופן שבו אפשר לטפל בשגיאה שניתן לתקן:

val result =
   try {
     homeManager.requestPermissions()
   } catch (e: HomeException) {
     PermissionsResult(
       PermissionsResultStatus.ERROR,
       "Got HomeException with error: ${e.message}",
     )
   }

כל שיטה ב-Home APIs יכולה להחזיר 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 חיצוני לא כולל מספיק מידע לגבי הסיבה הבסיסית.