Menu
Coddy logo textTech

ensure ו־raise

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

שני חלקים נוספים משלימים את ערכת הכלים לטיפול בשגיאות.

ensure הוא בלוק שרץ בכל מקרה, בין אם begin הסתיים כרגיל, ובין אם ענף rescue תפס חריגה, ואפילו אם החריגה לא נתפסה. כאן שמים קוד ניקוי:

begin
  puts "opening file"
  raise "something broke"
rescue
  puts "caught it"
ensure
  puts "closing file"
end
# פותח קובץ
# תפסתי את השגיאה
# סוגר קובץ

raise היא הדרך ליצור חריגה משלך. מעבירים מחרוזת עבור ההודעה, או מחלקה יחד עם הודעה:

def withdraw(amount)
  raise ArgumentError, "amount must be positive" if amount <= 0
  # ... בצע את המשיכה
end

הנוהג הוא להפעיל raise מוקדם, בראש המתודה, כדי להיכשל במהירות כשהארגומנטים שגויים. הקורא יכול להשתמש ב־rescue אם יש לו דרך הגיונית להתאושש, או לתת לשגיאה להמשיך לעלות.

challenge icon

אתגר

קל

הגדירו מתודה safe_divide(a, b) ש:

  • מעלה ArgumentError עם ההודעה "b cannot be zero" אם b == 0
  • אחרת מחזירה a / b

לאחר מכן קראו שני מספרים שלמים מהקלט. קראו ל־safe_divide בתוך begin / rescue / ensure:

  • במקרה של הצלחה, הדפיסו Result: <value>
  • במקרה של ArgumentError, הדפיסו Error: <message>
  • ב־ensure, הדפיסו תמיד Done.

עבור הקלט 10 / 2, הפלט הוא:

Result: 5
Done.

עבור הקלט 10 / 0:

Error: b cannot be zero
Done.

נסו בעצמכם

# TODO: הגדירו את safe_divide(a, b), שמעלה ArgumentError כאשר b == 0

a = gets.to_i
b = gets.to_i

# TODO: begin ... הדפיסו Result; rescue ArgumentError => e ... הדפיסו Error; ensure ... הדפיסו Done.
quiz iconבחנו את עצמכם

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

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

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