Swift:
טיפול בשגיאות

איך לעשות:

Swift משתמשת בטיפול שגיאות עם בלוקים של do, try, ו-catch. בואו נסתכל:

enum FileError: Error {
    case fileDoesNotExist
    case noPermission
}

func readFile(atPath path: String) throws -> String {
    // נדמה שיש לנו כאן קצת לוגיקה לבדוק אם קובץ קיים ואם יש לנו הרשאה לקרוא אותו
    let fileExists = false
    let havePermission = true

    if !fileExists {
        throw FileError.fileDoesNotExist
    }

    if !havePermission {
        throw FileError.noPermission
    }

    return "תוכן הקובץ יהיה כאן"
}

do {
    let fileContent = try readFile(atPath: "/path/to/file")
    print(fileContent)
} catch FileError.fileDoesNotExist {
    print("אופס! הקובץ לא נמצא.")
} catch FileError.noPermission {
    print("אה! אין הרשאה לקרוא את הקובץ.")
} catch {
    print("אירעה שגיאה לא ידועה.")
}

פלט לדוגמה:

אופס! הקובץ לא נמצא.

צלילה עמוקה

טיפול בשגיאות לא תמיד היה מושחל כמו שהוא עכשיו. ב-Objective-C, היית עוסק עם מצביינים לאובייקטים NSError, שהרגישו מגושמים. עכשיו, יש לנו מערכת יותר אלגנטית עם enums של Swift והפרוטוקול Error.

הפקודה throw של Swift מאפשרת לנו לאותת שמשהו השתבש. בלוקי do פועלים כמו תחומים מודעים לשגיאות, try מסמן קריאות בעייתיות, ו-catch מטפל בכל דבר אם הוא הולך דרום.

אופציונלים הם חלופה עבור מצבים שאינם דווקא בסטטוס “שגיאה” אבל עדיין עלולים לא להכיל “תוצאה”. הם מעין משתנים של שרדינגר - יש להם ערך או שאין להם.

לעומק אמיתי, בדקו את טיפוסי Result, שהם היברידים שיקיים בין תבניות תוצאה רגילה לתבניות שגיאה.

ראה גם