תפיסת חריגות באמצעות 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 כדי לטפל בסוגים שונים של חריגות באמצעות תגובות מתאימות, וכך להפוך את הטיפול בשגיאות למדויק וידידותי למשתמש.
אתגר
קלצרו תוכנית שמדגימה תפיסת חריגות ספציפיות באמצעות מילת המפתח on. התוכנית שלכם תעבד סוגים שונים של קלט מהמשתמש ותטפל בסוגי חריגות ספציפיים באמצעות הודעות שגיאה מותאמות.
- קראו קלט מסוג מחרוזת שמייצג סוג של ביטוי מתמטי (
"parse","divide"או"access") - קראו קלט מסוג מחרוזת שמייצג את הערך הראשון
- קראו קלט מסוג מחרוזת שמייצג את הערך השני (אם רלוונטי)
- בהתאם לסוג הביטוי, בצעו את הפעולה המתאימה באמצעות טיפול ספציפי בחריגות:
- עבור
"parse": המירו את הערך הראשון למספר שלם באמצעותint.parse()ותפסו באופן ספציפי אתFormatException - עבור
"divide": נתחו את שני הערכים כמספרים שלמים ובצעו חילוק, תוך תפיסתFormatExceptionבמקרה של שגיאות ניתוח - עבור
"access": צרו מערך עם הערך הראשון וגשו לאינדקס שמצוין על ידי הערך השני, תוך תפיסתRangeErrorבמקרה של אינדקסים לא תקינים - הציגו את התוצאות או את הודעות השגיאה הספציפיות בפורמט המדויק שמוצג להלן
לדוגמה, אם הקלט הוא "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
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1מניפולציות מתקדמות ברשימות
מאפייני רשימה: ראשון ואחרוןמצב הרשימה: isEmpty ו-isNotEmpהיפוך רשימההוספה לרשימה: insertהסרת פריטים מרשימה: removeWhereחיפוש ברשימה: indexOfמיון רשימהערבוב רשימהסיכום – מארגן רשימות4מניפולציה מתקדמת של Map
מעבר על Mapבדיקה אם מפתחות וערכים קיימיםמאפייני Map: מפתחות וערכיםהוספה מותנית: putIfAbsentהסרת רשומות מ־MapMaps מקונניםסיכום – עדכון מלאי2פעולות פונקציונליות על רשימות
טרנספורמציה באמצעות 'map'סינון באמצעות 'where'שימוש ב-'.toList()'בדיקת תנאים באמצעות 'any'תנאים באמצעות 'every'איתור באמצעות 'firstWhere'סיכום – סינון נתונים5פרויקט: חישוב עגלת קניות
הגדרת הפרויקטהוספת פריטים לעגלה3קבוצות
מהי קבוצה?יצירת קבוצההוספה והסרה מקבוצותבדיקת נוכחות של איברים בקבוצההמרת רשימה לקבוצהאיחוד קבוצותחיתוך קבוצותהפרש קבוצותסיכום – רשימת אורחים ייחודית6טיפול בסיסי בשגיאות
מהן חריגות?בלוק ה-try-catchתפיסת חריגות באמצעות onבלוק ה-finallyהשלכת חריגהסיכום – חלוקה בטוחה9טיפוסי מנייה (Enums)
מה הם Enums?הגדרת Enum פשוטשימוש ב-Enums במשתניםEnums במשפטי 'switch'סיכום – רמזורתרגלו בעצמכם: קומפיילר Dart אונליין