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

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

דוגמה לטיפול בכשל שניתן לשחזור:

    let light1 = lightDevices.first
    if let light = light1 {
    do {
      try await structure.move(device: light, to: room)
    } catch let error as HomeError {
      // Code for handling the exception
    }

בטבלה הבאה מפורטות המשמעויות של קודי HomeError שאתם עשויים להיתקל בהם:

טבלה: קודי HomeError
קוד משמעות
aborted הפעולה בוטלה. השגיאה הזו מופיעה בדרך כלל כשיש בעיה בו-זמנית, כמו כשל בבדיקת רצף או ביטול של טרנזקציה.
alreadyExists המשאב או הישות שאתם מנסים ליצור כבר קיימים. לדוגמה, לוח זמנים עם שם לתרמוסטט.
cancelled הפעולה בוטלה, בדרך כלל על ידי הגורם המזמין.
dataLoss אובדן נתונים או פגיעה בנתונים שלא ניתן לשחזר.
deadlineExceeded המועד האחרון חלף לפני שהפעולה הסתיימה. בפעולות שמשנות את מצב המערכת, יכול להיות שהשגיאה הזו תוחזר גם אם הפעולה הושלמה בהצלחה. לדוגמה, יכול להיות שתגובה מוצלחת מהשרת התעכבה מספיק זמן כדי שהמועד האחרון יחלוף.
failedPrecondition הפעולה נדחתה כי המערכת לא במצב שנדרש לביצוע הפעולה. לדוגמה, יכול להיות שתקבלו את ההודעה הזו אם קראתם ל-stop בתנור שכבר כבוי.
internal שגיאות פנימיות. המשמעות היא שחלק מהאינווריאנטים שצפויים על ידי המערכת הבסיסית הופרו. קוד השגיאה הזה שמור לשגיאות חמורות.
invalidArgument הלקוח ציין ארגומנט לא תקין. שימו לב שהשגיאה הזו שונה מ-`failedPrecondition`. השגיאה `invalidArgument` מציינת ארגומנטים בעייתיים בלי קשר למצב המערכת (לדוגמה, שם קובץ בפורמט שגוי).
notFound ציינתם ישות או משאב שלא נמצאו. לדוגמה, ציון מזהה טראק שלא קיים כשמפעילים את play במכשיר נגן מדיה.
outOfRange פרמטר חרג מהטווח החוקי, בהתאם למצב המערכת הנוכחי. ההודעה הזו מופיעה כשהערך נמצא בטווח הערכים שהקריאה ל-API יכולה לקבל, אבל הוא לא הגיוני בהקשר הנוכחי.
permissionDenied אין לך הרשאה לבצע את הפעולה שצוינה. קוד השגיאה הזה לא מציין שהבקשה תקינה.
resourceExhausted משאב מסוים מוצה. לדוגמה, השגיאה הזו יכולה להופיע כשמפעילים את הפקודה dispense(item:amount:unit:presetName:) במכשיר להאכלת חיות מחמד, ואין יותר אוכל במכשיר.

יכול להיות גם שחרגתם ממכסת הפרויקטים של Home APIs. למידע נוסף, קראו את המאמר ניהול מכסות.
unauthenticated אי אפשר לזהות את הגורם ששלח את הקריאה, או שהבקשה לא כוללת פרטי כניסה תקינים לאימות.
unavailable השירות לא זמין. כנראה מדובר במצב זמני, שאפשר לתקן על ידי ניסיון חוזר עם השהיה לפני ניסיון חוזר. חשוב לזכור שלא תמיד בטוח לנסות שוב פעולות שהן לא אידמפוטנטיות.
unimplemented הפעולה המבוקשת לא מיושמת, נתמכת או מופעלת בשירות הזה.
unknown שגיאה לא ידועה. באופן כללי, קוד השגיאה unknown מופיע כשמתרחש מצב שגיאה שלא ניתן לסווג באמצעות אף אחד מקודי השגיאה האחרים. לדוגמה, השגיאה הזו עשויה להופיע כשערך סטטוס שמתקבל מ-API חיצוני לא כולל מספיק מידע לגבי שורש הבעיה.