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