בלוק ה-finally
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 41 מתוך 65.
לפעמים צריך קוד שרץ בלי קשר למה שקורה בתוך בלוק ה־try-catch שלך. בלוק ה־finally נועד בדיוק למטרה הזו — הוא מכיל קוד שתמיד מתבצע, בין אם מתרחשת חריגה ובין אם לא.
בלוק finally מופיע אחרי בלוקי try ו-catch. גם אם הקוד שלך רץ בהצלחה ביחידת try, או אם חריגה נתפסת ומטופלת, בלוק finally עדיין יבוצע.
try {
// קוד שעלול לגרום לחריגה
int result = 10 ~/ 2;
print("Result: $result");
} catch (e) {
print("An error occurred: $e");
} finally {
print("This always runs!");
}כך בלוק ה־finally מתאים במיוחד לפעולות ניקוי, כמו סגירת קבצים, שחרור משאבים או רישום ביומן שהפעולה הושלמה. לא משנה מה יקרה במהלך הטיפול בשגיאות, אפשר להבטיח שקוד מסוים תמיד ירוץ.
אתגר
קלצרו תוכנית שמדגימה את בלוק finally באמצעות מימוש סימולטור לעיבוד קבצים שמבצע תמיד פעולות ניקוי, ללא קשר לשאלה אם מתרחשת שגיאה במהלך העיבוד.
- קראו קלט מסוג מחרוזת שמייצג את שם הקובץ לעיבוד
- קראו קלט מסוג מחרוזת שמייצג את תוכן הקובץ
- קראו קלט מסוג מחרוזת שמייצג אם לדמות שגיאה (
"error"או"success") - השתמשו במבנה
try-catch-finallyכדי לדמות עיבוד קבצים: - בבלוק
try: בדקו אם הדמיית השגיאה היא"error", ואם כן זרקו חריגה עם ההודעה"File processing failed"; אחרת, עבדו את הקובץ בהצלחה - בבלוק
catch: טפלו בכל חריגה שמתרחשת במהלך העיבוד - בבלוק
finally: בצעו תמיד פעולות ניקוי, ללא קשר להצלחה או לכישלון - הציגו את תוצאות העיבוד בדיוק בפורמט שמוצג להלן
לדוגמה, אם הקלטים הם "document.txt", "Hello World", "success", התוכנית שלכם צריכה להפיק:
File Processing System
======================
Opening file: document.txt
File content: Hello World
Processing file successfully...
File processed: 11 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfullyאם הקלטים הם "report.pdf", "Annual Report Data", "error", התוכנית שלכם צריכה להפיק:
File Processing System
======================
Opening file: report.pdf
File content: Annual Report Data
Error occurred: File processing failed
Unable to complete file processing
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed with errorsאם הקלטים הם "config.json", "{\"setting\": \"value\"}", "success", התוכנית שלכם צריכה להפיק:
File Processing System
======================
Opening file: config.json
File content: {"setting": "value"}
Processing file successfully...
File processed: 20 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfullyעל התוכנית שלכם להשתמש במבנה try-catch-finally, שבו בלוק finally מבצע תמיד את שלוש פעולות הניקוי בדיוק בסדר המוצג. בבלוק try, בדקו אם קלט הדמיית השגיאה שווה ל-"error", ואם כן זרקו חריגה. אם לא מדמים שגיאה, ספרו את התווים בתוכן הקובץ באמצעות המאפיין length. בלוק finally צריך תמיד להדפיס את הודעות הניקוי ולקבוע את סטטוס הסיום בהתאם לשאלה אם התרחשה שגיאה.
נסו בעצמכם
import 'dart:io';
void main() {
// קראו את הקלט
String? filename = stdin.readLineSync();
String? content = stdin.readLineSync();
String? errorSimulation = stdin.readLineSync();
// הציגו את כותרת המערכת
print("File Processing System");
print("======================");
print("Opening file: $filename");
print("File content: $content");
// TODO: כתבו את הקוד שלכם למטה
// השתמשו במבנה try-catch-finally כדי לדמות עיבוד קובץ
// - בבלוק try: בדקו אם errorSimulation שווה ל-"error" וזרקו חריגה אם כן
// - בבלוק catch: טפלו בכל חריגה
// - בבלוק finally: בצעו תמיד פעולות ניקוי
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
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 אונליין