Menu
Coddy logo textTech

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

challenge icon

אתגר

קל

הגדר 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 עם שלושה ענפים ועוד ענף שתופס את כל השאר
quiz iconבחנו את עצמכם

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

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

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