טיפול בשגיאות ב-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 שגיאות פנימיות. המשמעות היא שחלק מהקבועים שלא משתנים (invariants) שצפויים במערכת הבסיסית הופרו. קוד השגיאה הזה מיועד לשגיאות חמורות.
invalidArgument הלקוח ציין ארגומנט לא חוקי. חשוב לזכור שהקוד הזה שונה מ-failedPrecondition. קוד הסטטוס invalidArgument מציין ליקויים בארגומנטים, ללא קשר למצב המערכת (לדוגמה, שם קובץ בפורמט שגוי).
notFound ציינת ישות או משאב שלא ניתן למצוא. לדוגמה, ציון מזהה טראק לא קיים בקריאה ל- play במכשיר נגן מדיה.
outOfRange פרמטר חרג מהטווח החוקי, על סמך המצב הנוכחי של המערכת. ההודעה הזו מופיעה כשהערך נמצא בטווח הערכים שקריאת ה-API יכולה לקבל, אבל הוא לא הגיוני בהקשר הנוכחי.
permissionDenied אין לכם הרשאה להריץ את הפעולה שצוינה. קוד השגיאה הזה לא צריך להיחשב כסימן לכך שהבקשה תקינה מבחינות אחרות.
resourceExhausted משאב מסוים מוצה. לדוגמה, האירוע הזה יכול להתרחש כששולחים קריאה ל- dispense(item:amount:unit:presetName:) במכשיר למזון לחיות מחמד ואין יותר מזון ביחידה.
unauthenticated לא ניתן לזהות את מבצע הקריאה החוזרת או שהבקשה לא כוללת פרטי כניסה תקפים לאימות.
unavailable השירות לא זמין. סביר להניח שמדובר במצב זמני, שאפשר לתקן אותו על ידי ניסיון חוזר עם זמן המתנה. חשוב לזכור שלא תמיד בטוח לנסות שוב פעולות לא אידמפוטנטיות.
unimplemented הפעולה המבוקשת לא יושמה, לא נתמכת או לא מופעלת בשירות הזה.
unknown שגיאה לא ידועה. באופן כללי, השגיאה unknown מופיעה כשמתרחש תנאי שגיאה שלא ניתן לסווג באמצעות אחד מקודי השגיאה האחרים. לדוגמה, השגיאה הזו עשויה להופיע כשערך הסטטוס שמתקבל מ-API חיצוני חסר מידע מספיק לגבי שורש הבעיה.