טיפול בשגיאות ב-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:) במכשיר להאכלת חיות מחמד, ולא נשאר יותר מזון ביחידה.
unauthenticated לא ניתן לזהות את המתקשר או שבקשה לא כוללת פרטי אימות תקינים.
unavailable השירות לא זמין. הסיבה היא כנראה מצב זמני שאפשר לתקן אותו באמצעות ניסיון חוזר עם השהיה. שימו לב שלא תמיד בטוח לנסות שוב פעולות שהן לא אידמפוטנטיות.
unimplemented הפעולה המבוקשת לא יושמה, לא נתמכת או לא מופעלת בשירות הזה.
unknown שגיאה לא ידועה. באופן כללי, unknown מופיע כשמתרחש תנאי שגיאה שלא ניתן לסווג באמצעות אף אחד מקודי השגיאה האחרים. לדוגמה, השגיאה הזו יכולה להיות מוחזרת כשערך סטטוס שמתקבל מ-API חיצוני חסר מידע מספיק לגבי שורש הבעיה.