Start · Sprachen · PHP · Referenz · ZookeeperException

ZookeeperException

Klasse

Basisklasse für alle Ausnahmen, die von der PHP-ZooKeeper-Erweiterung ausgelöst werden.

seit PHP 3.4.6 Kategorie: error

Signatur

class ZookeeperException extends RuntimeException

Beschreibung

ZookeeperException ist die gemeinsame Basisklasse aller Fehler, die von der PECL-Erweiterung zookeeper geworfen werden. Sie erweitert RuntimeException und kann daher überall dort abgefangen werden, wo allgemeine Laufzeitfehler behandelt werden.

Durch das Ableiten von RuntimeException ist ZookeeperException selbst wiederum Basis für spezialisiertere Ausnahmen wie ZookeeperAuthenticationException, ZookeeperConnectionException oder ZookeeperMarshallingException. Auf diese Weise lassen sich grobe (ZookeeperException) und feine (spezifischere Unterklassen) Fehlerbehandlungsstrategien kombinieren.

Typische Szenarien, in denen ZookeeperException geworfen wird, sind Verbindungsfehler zum ZooKeeper-Ensemble, fehlgeschlagene Knoten-Operationen (Lesen, Schreiben, Löschen) sowie Berechtigungs- oder Authentifizierungsprobleme. Die Fehlercodes entsprechen den von ZooKeeper definierten C-Client-Fehlercodes und können über getCode() abgerufen werden.

Beim Aufbau robuster verteilter Anwendungen empfiehlt es sich, ZookeeperException im äußersten catch-Block zu verwenden, um unbehandelte ZooKeeper-Fehler abzusichern, während spezifischere Ausnahmen in inneren Blöcken gezielt behandelt werden.

Beispiele

Verbindung zu ZooKeeper herstellen und Fehler abfangen

<?php
try {
    $zk = new Zookeeper('localhost:2181');
    $data = $zk->get('/my/node');
    echo 'Wert: ' . $data;
} catch (ZookeeperConnectionException $e) {
    // Speziellerer Catch-Block für Verbindungsfehler
    echo 'Verbindungsfehler: ' . $e->getMessage();
} catch (ZookeeperException $e) {
    // Allgemeiner Fallback für alle ZooKeeper-Fehler
    echo 'ZooKeeper-Fehler (Code ' . $e->getCode() . '): ' . $e->getMessage();
}

Eigene Unterklasse von ZookeeperException

<?php
class MyAppZookeeperException extends ZookeeperException
{
    public function __construct(string $context, int $code = 0, ?\Throwable $previous = null)
    {
        parent::__construct(
            sprintf('[%s] ZooKeeper-Operation fehlgeschlagen.', $context),
            $code,
            $previous
        );
    }
}

function readConfig(Zookeeper $zk, string $path): string
{
    try {
        $value = $zk->get($path);
        if ($value === false) {
            throw new MyAppZookeeperException('readConfig');
        }
        return $value;
    } catch (ZookeeperException $e) {
        throw new MyAppZookeeperException('readConfig', $e->getCode(), $e);
    }
}

try {
    $zk = new Zookeeper('localhost:2181');
    echo readConfig($zk, '/config/db_host');
} catch (MyAppZookeeperException $e) {
    echo 'Anwendungsfehler: ' . $e->getMessage();
}

// Wichtig · Fallstricke

Fehlercodes: Der über getCode() zurückgegebene Integer-Wert entspricht den ZooKeeper-internen Fehlercodes des C-Clients (z. B. -4 für ZCONNECTIONLOSS, -110 für ZSESSIONEXPIRED). Die Konstanten sind als Klassenkonstanten der Klasse Zookeeper verfügbar (z. B. Zookeeper::CONNECTIONLOSS).

Erweiterung erforderlich: ZookeeperException steht nur zur Verfügung, wenn die PECL-Erweiterung zookeeper installiert und geladen ist. Ohne diese Erweiterung führt der Verweis auf die Klasse zu einem fatalen Fehler.

Retry-Logik: Bei vorübergehenden Verbindungsfehlern (z. B. ZCONNECTIONLOSS) ist eine Retry-Strategie mit exponentiellem Backoff empfehlenswert, bevor die Ausnahme an den Aufrufer weitergegeben wird.