Menu
Coddy logo textTech

תפיסת חריגות באמצעות on

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 40 מתוך 65.

בעוד שבלוק ה-try-catch הבסיסי תופס כל חריגה שמתרחשת, לפעמים צריך לטפל בסוגים שונים של חריגות בדרכים שונות. מילת המפתח on מאפשרת לתפוס סוגים מסוימים של חריגות ולספק מענה מותאם לכל אחד מהם.

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

try {
  int number = int.parse("abc");
} on FormatException {
  print("Please enter a valid number");
}

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

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

challenge icon

אתגר

קל

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

  1. קראו קלט מסוג מחרוזת שמייצג סוג של ביטוי מתמטי ("parse", "divide" או "access")
  2. קראו קלט מסוג מחרוזת שמייצג את הערך הראשון
  3. קראו קלט מסוג מחרוזת שמייצג את הערך השני (אם רלוונטי)
  4. בהתאם לסוג הביטוי, בצעו את הפעולה המתאימה באמצעות טיפול ספציפי בחריגות:
    • עבור "parse": המירו את הערך הראשון למספר שלם באמצעות int.parse() ותפסו באופן ספציפי את FormatException
    • עבור "divide": נתחו את שני הערכים כמספרים שלמים ובצעו חילוק, תוך תפיסת FormatException במקרה של שגיאות ניתוח
    • עבור "access": צרו מערך עם הערך הראשון וגשו לאינדקס שמצוין על ידי הערך השני, תוך תפיסת RangeError במקרה של אינדקסים לא תקינים
  5. הציגו את התוצאות או את הודעות השגיאה הספציפיות בפורמט המדויק שמוצג להלן

לדוגמה, אם הקלט הוא "parse", "42", "unused", התוכנית שלכם אמורה להציג:

Operation: parse
Input: 42
Parsing successful!
Result: 42

אם הקלט הוא "parse", "xyz", "unused", התוכנית שלכם אמורה להציג:

Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integer

אם הקלט הוא "divide", "10", "2", התוכנית שלכם אמורה להציג:

Operation: divide
Values: 10, 2
Division successful!
Result: 5

אם הקלט הוא "divide", "10", "abc", התוכנית שלכם אמורה להציג:

Operation: divide
Values: 10, abc
FormatException caught: Invalid number format
Cannot perform division with invalid numbers

אם הקלט הוא "access", "hello", "1", התוכנית שלכם אמורה להציג:

Operation: access
List: [hello]
Index: 1
RangeError caught: Index out of range
Valid indices are 0 to 0

על התוכנית שלכם להשתמש בבלוקי try-catch נפרדים עם מילת המפתח on, כדי לתפוס באופן ספציפי את FormatException ואת RangeError. לכל סוג חריגה צריכה להיות הודעת שגיאה מותאמת משלו, שמסבירה בבירור מה השתבש. עבור פעולת "access", צרו מערך שמכיל רק את ערך הקלט הראשון ונסו לגשת לאינדקס שמצוין על ידי ערך הקלט השני.

נסו בעצמכם

import 'dart:io';

void main() {
  // קראו את הקלט
  String? operation = stdin.readLineSync();
  String? firstValue = stdin.readLineSync();
  String? secondValue = stdin.readLineSync();
  
  // הציגו מידע על הפעולה
  print('Operation: $operation');
  
  // TODO: כתבו את הקוד שלכם למטה
  // השתמשו בבלוקים של try-catch עם מילת המפתח 'on' כדי לטפל בחריגות מסוימות
  // טפלו ב-FormatException עבור פעולות parse ו-divide
  // טפלו ב-RangeError עבור פעולת access
  
}
quiz iconבחנו את עצמכם

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

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

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