Menu
Coddy logo textTech

throws ו־Error

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Swift של Coddy. שיעור 44 מתוך 56.

Swift מטפלת בשגיאות בכך שהיא מחייבת פונקציות להצהיר שהן עלולות להיכשל. גוף הפונקציה זורק ערך שגיאה; הקוד שקורא לה חייב לטפל בו.

סוג שגיאה הוא כל דבר שתואם לפרוטוקול המובנה Error. הדרך הפשוטה ביותר להגדיר סוג משלך היא באמצעות enum:

enum InputError: Error {
    case empty
    case tooLong
}

פונקציה שיכולה לזרוק שגיאה משתמשת במילת המפתח throws בחתימה שלה ובפקודת throw בגוף שלה:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

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

challenge icon

אתגר

קל

הגדירו enum בשם NumError: Error עם שני מקרים: negative ו-tooBig.

הגדירו פונקציה זורקת doubleSafely(_ n: Int) throws -> Int אשר:

  • זורקת את .negative כאשר n < 0
  • זורקת את .tooBig כאשר n > 100
  • אחרת מחזירה את n * 2

קראו מספר שלם יחיד מ-stdin. קראו ל-doubleSafely בתוך בלוק do/catch (תלמדו את הצורה המדויקת בשיעור הבא; בינתיים השתמשו בשלד המדויק הזה):

do {
    let result = try doubleSafely(n)
    print("ok: \(result)")
} catch NumError.negative {
    print("negative")
} catch NumError.tooBig {
    print("too big")
} catch {
    print("unknown")
}

עבור הקלט 10 הפלט הוא ok: 20. עבור -1 הפלט הוא negative. עבור 500 הפלט הוא too big.

נסו בעצמכם

let n = Int(readLine()!)!

// TODO: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: Swift אונליין