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
}אי אפשר לקרוא ישירות לפונקציה שעלולה להשליך שגיאה; המהדר מחייב אותך לטפל בשגיאה. השיעור הבא עוסק באופן שבו עושים זאת.
אתגר
קלהגדירו 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 { ... } ...
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
5פונקציות מסדר גבוה חלק 1
מיפוי (Map)סינון (Filter)צמצום (Reduce)שרשור map, filter ו-reduceסיכום – סטטיסטיקות מיליםתרגלו בעצמכם: Swift אונליין