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

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

כשמדובר בכשלים שניתן לשחזר, המפתח יכול לטפל בבעיות בצד שלו. לדוגמה, אם מזהה שמשמש בקריאה לא תקין, ה-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 בתנור שכבר מושבת.
INTERNAL שגיאות פנימיות. המשמעות היא שחלק מהקבועים שלא משתנים (invariants) שצפויים במערכת הבסיסית הופרו. קוד השגיאה הזה מיועד לשגיאות חמורות.
INVALID_ARGUMENT ציינת ארגומנט מחוץ לטווח הערכים הצפוי.
NOT_FOUND ציינת ישות או משאב שלא ניתן למצוא. לדוגמה, ציון מזהה טראק לא קיים בקריאה ל- activateAudioTrack במכשיר נגן מדיה.
OUT_OF_RANGE פרמטר חרג מהטווח החוקי, על סמך המצב הנוכחי של המערכת. ההודעה הזו מופיעה כשהערך נמצא בטווח הערכים שקריאת ה-API יכולה לקבל, אבל הוא לא הגיוני בהקשר הנוכחי.
PERMISSION_DENIED אין לכם הרשאה להריץ את הפעולה שצוינה. קוד השגיאה הזה לא צריך להיחשב כסימן לכך שהבקשה תקינה מבחינות אחרות.
RESOURCE_EXHAUSTED משאב מסוים מוצה. לדוגמה, האירוע הזה יכול להתרחש כששולחים קריאה ל- dispense במכשיר למזון לחיות מחמד ואין יותר מזון ביחידה.
SDK_INITIALIZATION_MISSING_INFO ה-SDK לא הופעל באופן מלא. לדוגמה, ההודעה הזו תוצג אם תנסו לקבל TraitFactory למאפיין שלא נרשם. איך מפעילים את דף הבית ב-Android
UNAUTHENTICATED לא ניתן לזהות את מבצע הקריאה החוזרת או שהבקשה לא כוללת פרטי כניסה תקפים לאימות.
UNAVAILABLE השירות לא זמין. סביר להניח שמדובר במצב זמני, שאפשר לתקן אותו על ידי ניסיון חוזר עם זמן המתנה. חשוב לזכור שלא תמיד בטוח לנסות שוב פעולות לא אידמפוטנטיות.
UNIMPLEMENTED הפעולה המבוקשת לא יושמה, לא נתמכת או לא מופעלת בשירות הזה.
UNKNOWN שגיאה לא ידועה. באופן כללי, השגיאה UNKNOWN מופיעה כשמתרחש תנאי שגיאה שלא ניתן לסווג באמצעות אחד מקודי השגיאה האחרים. לדוגמה, השגיאה הזו עשויה להופיע כשערך הסטטוס שמתקבל מ-API חיצוני חסר מידע מספיק לגבי שורש הבעיה.