ב-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
שעשויים להופיע:
קוד | משמעות |
---|---|
ABORTED
| הפעולה בוטלה, בדרך כלל בגלל בעיה של בו-זמניות, כמו כשל בבדיקת מאסף או ביטול עסקה. |
ALREADY_EXISTS |
הישות שהלקוח ניסה ליצור, למשל קובץ או ספרייה, כבר קיימת. |
API_NOT_CONNECTED |
הלקוח ניסה להפעיל שיטה מ-API שלא הצליח להתחבר. מצב כזה יכול לקרות כשהמכשיר לא מחובר לאינטרנט או שהוא לא תומך ב-API שהלקוח ניסה להפעיל. |
CANCELLED |
הפעולה בוטלה, בדרך כלל על ידי מבצע הקריאה החוזרת. |
DATA_LOSS |
אירעו אובדן נתונים או פגיעה בנתונים שלא ניתן לשחזר. |
DEADLINE_EXCEEDED |
מועד היעד פג לפני שהפעולה הושלמה. יכול להיות שהשגיאה הזו תוחזר גם אם הפעולה הושלמה בהצלחה, עבור פעולות שמחליפות את מצב המערכת. |
FAILED_PRECONDITION |
הפעולה נדחתה כי המערכת לא במצב שנדרש לביצוע הפעולה. לדוגמה, יכול להיות שתקבלו את ההודעה הזו אם הפעלתם את הפקודה stop של OvenCavityOperationalStateTrait בתנור שכבר הפסיק לפעול, או אם ניסיתם להריץ פעולת rmdir במקום שאינו ספרייה. |
INTERNAL |
שגיאות פנימיות. המשמעות היא שחלק מהקבועים שלא משתנים (invariants) שצפויים במערכת הבסיסית הופרו. קוד השגיאה הזה מיועד לשגיאות חמורות. |
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 חיצוני חסר מידע מספיק לגבי שורש הבעיה. |