Try, Catch, Finally
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 68 מתוך 91.
עכשיו, כשאתה יודע איך ליצור ולזרוק חריגות, עליך ללמוד איך לתפוס אותן. המבנה try-catch-finally מאפשר לך לטפל בחריגות בצורה מסודרת במקום לתת להן לגרום לקריסת היישום שלך.
עטפו קוד שעלול להעלות חריגה בבלוק try, ואז טפלו בחריגה בבלוק catch:
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
$calc = new Calculator();
try {
echo $calc->divide(10, 0);
} catch (InvalidArgumentException $e) {
echo "Error: " . $e->getMessage();
}
פלט:
Error: Cannot divide by zeroאפשר ללכוד סוגים שונים של חריגות באמצעות כמה בלוקי catch. PHP בודק אותם לפי הסדר, לכן הצב תחילה חריגות ספציפיות יותר:
<?php
try {
// קוד מסוכן
} catch (InvalidArgumentException $e) {
echo "Bad input: " . $e->getMessage();
} catch (Exception $e) {
echo "Something went wrong: " . $e->getMessage();
}
הבלוק finally מופעל בין אם נזרקה חריגה ובין אם נתפסה. הוא מושלם למשימות ניקוי כמו סגירת חיבורים:
<?php
try {
echo "Attempting operation\n";
throw new Exception("Failed");
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
} finally {
echo "Cleanup complete";
}
פלט:
Attempting operation
Caught: Failed
Cleanup completeבלוק finally מתבצע גם אם מחזירים ערך מתוך בלוקי try או catch, ולכן הוא אמין לפעולות ניקוי חיוניות.
אתגר
קלבואו נבנה מערכת לעיבוד קבצים שמדגימה כיצד try-catch-finally פועלים יחד כדי לטפל בשגיאות בצורה מסודרת, תוך הבטחה שניקוי המשאבים יתבצע תמיד.
תארגנו את הקוד שלכם בשלושה קבצים:
FileException.php: צרו מחלקה מותאמת אישית בשםFileExceptionשמרחיבה אתException. היא תייצג שגיאות הקשורות לקבצים במערכת שלכם.FileProcessor.php: צרו מחלקה בשםFileProcessorשמדמה פעולות על קבצים. כללו את הקובץ FileException. למחלקה שלכם צריכים להיות:- מאפיין בוליאני פרטי
$isOpenשמאותחל לערךfalse - מתודה
open(string $filename): voidשמגדירה את$isOpenלערךtrueומדפיסה"Opening: [filename]". אם שם הקובץ הוא"invalid.txt", זרקוFileExceptionעם ההודעה"Cannot open file" - מתודה
process(): voidשמדפיסה"Processing file...". אם הערך של$isOpenהואfalse, זרקוRuntimeExceptionעם ההודעה"File not open" - מתודה
close(): voidשמגדירה את$isOpenלערךfalseומדפיסה"File closed" - מתודה
isOpen(): boolשמחזירה את המצב הנוכחי
- מאפיין בוליאני פרטי
main.php: כללו את הקובץ FileProcessor. תקבלו קלט אחד: שם קובץ.צרו מופע של
FileProcessorוהשתמשו במבנהtry-catch-finallyכדי:- בבלוק
try: קראו ל־open()עם שם הקובץ, ואז קראו ל־process() - תפסו תחילה את
FileExceptionוהדפיסו"File error: [message]" - תפסו את
RuntimeExceptionוהדפיסו"Runtime error: [message]" - בבלוק
finally: בדקו אם הקובץ פתוח באמצעותisOpen(), ואם כן, קראו ל־close(). לאחר מכן הדפיסו"Cleanup complete"
- בבלוק
בלוק finally מבטיח שניקוי המשאבים יתבצע בין אם הפעולות מצליחות ובין אם הן נכשלות. תבנית זו חיונית לניהול משאבים כמו קבצים, חיבורי מסד נתונים או שקעי רשת, שבהם יש לבצע ניקוי ללא קשר למה שמתרחש במהלך העיבוד.
נסו בעצמכם
<?php
require_once 'FileProcessor.php';
// קרא את הקלט
$filename = trim(fgets(STDIN));
// TODO: צור מופע של FileProcessor
// TODO: השתמש במבנה try-catch-finally:
// - בבלוק try: קרא ל־open() עם שם הקובץ, ואז קרא ל־process()
// - תפוס תחילה את FileException והדפס "File error: [message]"
// - תפוס את RuntimeException והדפס "Runtime error: [message]"
// - בבלוק finally: בדוק באמצעות isOpen() אם הקובץ פתוח, ואם כן קרא ל־close()
// לאחר מכן הדפס "Cleanup complete"
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח $thisמתודותמאפייניםבנאי (__construct)הורס (__destruct)חזרה: מחשבון פשוט4ירושה
ירושה בסיסיתמילת המפתח parent::דריסת מתודותמילת המפתח finalמחלקות מופשטותסיכום – היררכיית עובדים7כימוס
ציבורי, מוגן, פרטימפרטי גישה לעומקמתודות גישה ועדכוןהסתרת מידעקידום פרמטרים בבנאי (8.0)סיכום – מערכת רישומי תלמידים2מרחבי שמות וטעינה אוטומטית
מבוא למרחבי שמותמילת המפתח useתקן הטעינה האוטומטית PSR-4הטוען האוטומטי של Composerסיכום – פרויקט מאורגן5ממשקים וחוזים
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםממשק לעומת מחלקה מופשטתרמזי טיפוסים עם ממשקיםסיכום - מחשבון צורות8מתודות קסם
מבוא למתודות קסם__toString ו־__debugInfo__get, __set, __isset, __unset__call ו־__callStatic__clone ושיבוט אובייקטים__serialize ו־__unserializeסיכום – אוסף מותאם אישית11מערכת טיפוסים וטיפול בשגיאות
הצהרות טיפוסיםטיפוסים שניתנים להכלה של nullטיפוסי איחוד וחיתוךמחלקות חריגההיררכיית חריגות מותאמת אישיתTry, Catch, Finallyסיכום – מאמת טפסים3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין