Menu
Coddy logo textTech

מחלקות חריגה

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 66 מתוך 91.

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

כשזורקים חריגה, יוצרים מופע של המחלקה Exception (או של מחלקת משנה שלה) עם הודעה שמתארת מה השתבש:

<?php
class BankAccount {
    public function __construct(private float $balance = 0) {}
    
    public function withdraw(float $amount): float {
        if ($amount > $this->balance) {
            throw new Exception("Insufficient funds");
        }
        $this->balance -= $amount;
        return $amount;
    }
}

$account = new BankAccount(100);
$account->withdraw(150);

פעולה זו תגרום לשגיאת חריגה שלא נתפסה עם ההודעה "Insufficient funds".

PHP מספקת כמה מחלקות חריגות מובנות למצבים שונים. InvalidArgumentException מציינת קלט שגוי, RuntimeException מציינת שגיאות במהלך הביצוע, ו-LogicException מייצגת שגיאות תכנות:

<?php
class Calculator {
    public function divide(int $a, int $b): float {
        if ($b === 0) {
            throw new InvalidArgumentException("Cannot divide by zero");
        }
        return $a / $b;
    }
}

כל אובייקט חריגה מכיל מידע שימושי: getMessage() מחזירה את הודעת השגיאה, getCode() מחזירה קוד שגיאה אופציונלי, ו-getFile() ו-getLine() מציינות היכן החריגה נזרקה. שימוש בסוגי חריגות ספציפיים מבהיר את כוונת הקוד שלך ומאפשר טיפול מדויק יותר בשגיאות.

challenge icon

אתגר

קל

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

תארגנו את הקוד בשלושה קבצים:

  • Product.php: צרו מחלקה Product שמייצגת פריט במלאי. השתמשו בקידום מאפיינים בבנאי עבור $sku ציבורי (מחרוזת), $name ציבורי (מחרוזת) ו-$quantity פרטי (מספר שלם). למחלקה שלכם צריכים להיות:
    • מתודה getQuantity(): int שמחזירה את הכמות הנוכחית
    • מתודה addStock(int $amount): void שמגדילה את הכמות. אם הכמות קטנה מ-1, זרקו InvalidArgumentException עם ההודעה "Amount must be positive"
    • מתודה removeStock(int $amount): void שמקטינה את הכמות. אם הכמות קטנה מ-1, זרקו InvalidArgumentException עם ההודעה "Amount must be positive". אם הכמות גדולה מהכמות הנוכחית, זרקו RuntimeException עם ההודעה "Insufficient stock"
  • Inventory.php: צרו מחלקה Inventory שמנהלת אוסף של מוצרים. כללו את קובץ Product. למחלקה שלכם צריכים להיות:
    • מערך פרטי לאחסון מוצרים, באינדקס לפי SKU
    • מתודה addProduct(Product $product): void שמוסיפה מוצר. אם כבר קיים מוצר עם אותו SKU, זרקו LogicException עם ההודעה "Product already exists: [sku]"
    • מתודה getProduct(string $sku): Product שמחזירה מוצר לפי SKU. אם המוצר לא נמצא, זרקו InvalidArgumentException עם ההודעה "Product not found: [sku]"
  • main.php: כללו את קובץ Inventory. תקבלו שלושה קלטים: SKU, שם מוצר ופעולה ("add", "remove" או "duplicate").

    צרו Inventory והוסיפו Product חדש עם ה-SKU והשם הנתונים, ועם כמות התחלתית של 10.

    בהתאם לפעולה:

    • "add": קראו ל-addStock(5) עבור המוצר, ואז הדפיסו "Stock updated: [quantity]"
    • "remove": קראו ל-removeStock(15) עבור המוצר (פעולה זו אמורה לזרוק חריגה)
    • "duplicate": נסו להוסיף מוצר נוסף עם אותו SKU (פעולה זו אמורה לזרוק חריגה)

    כאשר נזרקת חריגה, הדפיסו את שם המחלקה של החריגה ולאחריו ": " ואת הודעת החריגה. השתמשו בפונקציה get_class() של PHP כדי לקבל את שם המחלקה.

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

נסו בעצמכם

<?php

require_once 'Inventory.php';

// קראו את הקלטים
$sku = trim(fgets(STDIN));
$name = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));

try {
    // TODO: צרו Inventory
    // TODO: צרו Product עם ה-SKU, השם והכמות ההתחלתית 10 שניתנו
    // TODO: הוסיפו את המוצר למלאי
    
    // TODO: בהתאם לפעולה:
    // - "add": קראו ל-addStock(5) על המוצר, ואז הדפיסו "Stock updated: [quantity]"
    // - "remove": קראו ל-removeStock(15) על המוצר
    // - "duplicate": נסו להוסיף מוצר נוסף עם אותו SKU
    
} catch (Exception $e) {
    // TODO: הדפיסו את שם מחלקת החריגה, אחריו ": " ואז את ההודעה
    // רמז: השתמשו ב-get_class($e) כדי לקבל את שם המחלקה
}

?>
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה תכנות מונחה עצמים

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