do, try, catch
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Swift של Coddy. שיעור 45 מתוך 56.
הצורה המלאה לטיפול בשגיאות היא do/try/catch:
enum DivError: Error { case byZero }
func divide(_ a: Int, _ b: Int) throws -> Int {
if b == 0 { throw DivError.byZero }
return a / b
}
do {
let r = try divide(10, 2)
print(r) // 5
} catch DivError.byZero {
print("can't divide by zero")
} catch {
print("unknown error")
}try מופיע לפני כל קריאה שעלולה לזרוק שגיאה. אם הקריאה זורקת שגיאה, זרימת הבקרה קופצת אל ה־catch התואם; אחרת, הביצוע ממשיך אחרי בלוק ה־do.
סעיפי catch מרובים מתבצעים מלמעלה למטה, וההתאמה הראשונה מנצחת, בדיוק כמו ב־switch. סעיף catch ללא תנאי בסוף הוא סעיף שתופס הכול; כמעט תמיד כדאי לכלול אותו כדי שהמהדר יהיה מרוצה.
אתגר
קלהגדר enum בשם ParseError: Error עם שלושה מקרים: empty, notInteger ו-negative.
הגדר פונקציה שזורקת שגיאות parsePositive(_ s: String) throws -> Int ש:
- זורקת
.emptyכאשרsלאחר הסרת רווחים ריק - זורקת
.notIntegerכאשר אי אפשר לפענח אתsבתורInt - זורקת
.negativeכאשר הערך שפוענח הוא< 0 - אחרת מחזירה את הערך שפוענח
קרא שורה אחת מ-stdin וקרא ל-parsePositive בתוך בלוק do/catch. הדפס:
got: <n>במקרה של הצלחהerror: empty,error: not integerאוerror: negativeעבור כל מקרה
עבור הקלט 42, הפלט הוא got: 42. עבור שורה ריקה, הפלט הוא error: empty. עבור abc הפלט הוא error: not integer.
נסו בעצמכם
let line = readLine()!
// TODO: enum ParseError; func parsePositive(_:) throws -> Int;
// do/try/catch עם שלושה ענפים ועוד ענף שתופס את כל השאר
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
5פונקציות מסדר גבוה חלק 1
מיפוי (Map)סינון (Filter)צמצום (Reduce)שרשור map, filter ו-reduceסיכום – סטטיסטיקות מיליםתרגלו בעצמכם: Swift אונליין