Signatur
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.