Menu
Coddy logo textTech

Exception-Klassen

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 66 von 91.

In PHP sind Exceptions Objekte, die verwendet werden, um zu signalisieren, dass während der Ausführung etwas schiefgelaufen ist. Die Basisklasse für alle Exceptions ist Exception, und das Verständnis ihrer Struktur hilft Ihnen, Fehler in Ihren OOP-Anwendungen effektiv zu handhaben.

Wenn Sie eine Exception werfen, erstellen Sie eine Instanz der Exception-Klasse (oder einer Unterklasse) mit einer Nachricht, die beschreibt, was schiefgelaufen ist:

<?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);

Dies würde einen Fehler aufgrund einer nicht abgefangenen Exception mit der Nachricht "Insufficient funds" erzeugen.

PHP bietet mehrere integrierte Exception-Klassen für verschiedene Situationen. InvalidArgumentException signalisiert eine fehlerhafte Eingabe, RuntimeException weist auf Fehler während der Ausführung hin und LogicException repräsentiert Programmierfehler:

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

Jedes Exception-Objekt enthält nützliche Informationen: getMessage() gibt die Fehlermeldung zurück, getCode() gibt einen optionalen Fehlercode zurück, getFile() und getLine() teilen Ihnen mit, wo die Exception ausgelöst wurde. Die Verwendung spezifischer Exception-Typen macht die Absicht Ihres Codes klarer und ermöglicht eine präzisere Fehlerbehandlung.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Bestandsverwaltungssystem aufbauen, das die in PHP integrierten Exception-Klassen verwendet, um verschiedene Arten von Problemen zu signalisieren. Sie werden ein Produktinventar erstellen, bei dem Operationen auf spezifische, aussagekräftige Weise fehlschlagen können.

Sie werden Ihren Code über drei Dateien hinweg organisieren:

  • Product.php — Erstellen Sie eine Product-Klasse, die einen Artikel im Inventar darstellt. Verwenden Sie Constructor Promotion für ein öffentliches $sku (string), ein öffentliches $name (string) und ein privates $quantity (int). Ihre Klasse sollte Folgendes haben:
    • Eine Methode getQuantity(): int, die die aktuelle Menge zurückgibt
    • Eine Methode addStock(int $amount): void, die die Menge erhöht. Wenn der Betrag kleiner als 1 ist, werfen Sie eine InvalidArgumentException mit der Nachricht "Amount must be positive"
    • Eine Methode removeStock(int $amount): void, die die Menge verringert. Wenn der Betrag kleiner als 1 ist, werfen Sie eine InvalidArgumentException mit der Nachricht "Amount must be positive". Wenn der Betrag die aktuelle Menge übersteigt, werfen Sie eine RuntimeException mit der Nachricht "Insufficient stock"
  • Inventory.php — Erstellen Sie eine Inventory-Klasse, die eine Sammlung von Produkten verwaltet. Binden Sie die Product-Datei ein. Ihre Klasse sollte Folgendes haben:
    • Ein privates Array zum Speichern von Produkten, indiziert nach SKU
    • Eine Methode addProduct(Product $product): void, die ein Produkt hinzufügt. Wenn ein Produkt mit derselben SKU bereits existiert, werfen Sie eine LogicException mit der Nachricht "Product already exists: [sku]"
    • Eine Methode getProduct(string $sku): Product, die ein Produkt anhand der SKU zurückgibt. Wenn es nicht gefunden wird, werfen Sie eine InvalidArgumentException mit der Nachricht "Product not found: [sku]"
  • main.php — Binden Sie die Inventory-Datei ein. Sie erhalten drei Eingaben: eine SKU, einen Produktnamen und eine Operation ("add", "remove" oder "duplicate").

    Erstellen Sie ein Inventory und fügen Sie ein neues Product mit der angegebenen SKU, dem Namen und einer Anfangsmenge von 10 hinzu.

    Basierend auf der Operation:

    • "add": Rufen Sie addStock(5) für das Produkt auf und geben Sie dann "Stock updated: [quantity]" aus
    • "remove": Rufen Sie removeStock(15) für das Produkt auf (dies sollte eine Exception auslösen)
    • "duplicate": Versuchen Sie, ein weiteres Produkt mit derselben SKU hinzuzufügen (dies sollte eine Exception auslösen)

    Wenn eine Exception ausgelöst wird, geben Sie den Klassennamen der Exception gefolgt von ": " und der Nachricht der Exception aus. Verwenden Sie die PHP-Funktion get_class(), um den Klassennamen zu erhalten.

Diese Herausforderung zeigt, wie verschiedene Exception-Typen unterschiedliche Arten von Problemen kommunizieren — ungültige Eingaben, Laufzeitfehler und Logikfehler — wodurch die Fehlerbehandlung Ihres Codes präziser und aussagekräftiger wird.

Spickzettel

In PHP sind Exceptions (Ausnahmen) Objekte, die Fehler während der Ausführung signalisieren. Die Basisklasse ist Exception.

Um eine Exception auszulösen, erstellen Sie eine Instanz mit einer beschreibenden Nachricht:

<?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;
    }
}

PHP bietet integrierte Exception-Klassen für verschiedene Situationen an:

  • InvalidArgumentException — signalisiert ungültige Eingaben
  • RuntimeException — weist auf Fehler während der Ausführung hin
  • LogicException — repräsentiert Programmierfehler
<?php
class Calculator {
    public function divide(int $a, int $b): float {
        if ($b === 0) {
            throw new InvalidArgumentException("Cannot divide by zero");
        }
        return $a / $b;
    }
}

Exception-Objekte bieten nützliche Methoden:

  • getMessage() — gibt die Fehlermeldung zurück
  • getCode() — gibt einen optionalen Fehlercode zurück
  • getFile() — gibt die Datei zurück, in der die Exception ausgelöst wurde
  • getLine() — gibt die Zeilennummer zurück, in der die Exception ausgelöst wurde

Verwenden Sie get_class(), um den Klassennamen eines Exception-Objekts abzurufen.

Probier es selbst

<?php

require_once 'Inventory.php';

// Eingaben lesen
$sku = trim(fgets(STDIN));
$name = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));

try {
    // TODO: Ein Inventar erstellen
    // TODO: Ein Produkt mit der angegebenen SKU, dem Namen und einer Anfangsmenge von 10 erstellen
    // TODO: Das Produkt zum Inventar hinzufügen
    
    // TODO: Basierend auf der Operation:
    // - "add": addStock(5) für das Produkt aufrufen, dann "Stock updated: [quantity]" ausgeben
    // - "remove": removeStock(15) für das Produkt aufrufen
    // - "duplicate": Versuchen, ein weiteres Produkt mit derselben SKU hinzuzufügen
    
} catch (Exception $e) {
    // TODO: Den Namen der Exception-Klasse gefolgt von ": " und der Nachricht ausgeben
    // Hinweis: get_class($e) verwenden, um den Klassennamen zu erhalten
}

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung