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