Signatur
Beschreibung
FiberError ist eine spezialisierte Fehlerklasse, die von Error erbt und ausschließlich im Zusammenhang mit der Fiber-API (eingeführt in PHP 8.1) auftritt. Sie signalisiert, dass eine logisch unzulässige Aktion auf einer Fiber versucht wurde.
Typische Auslöser sind: Fortsetzen (resume()) einer noch nicht gestarteten Fiber, Fortsetzen einer bereits beendeten oder terminierten Fiber, der Versuch, eine Fiber von innerhalb einer anderen Fiber zu starten, oder das Aufrufen von Fiber::suspend() außerhalb einer laufenden Fiber.
Da FiberError von Error (und nicht von Exception) erbt, muss sie entweder mit catch (FiberError $e) oder catch (\Throwable $e) abgefangen werden – ein einfaches catch (Exception $e) reicht nicht aus.
In der Praxis sollte man die Zustände einer Fiber über die Methoden isStarted(), isRunning(), isSuspended() und isTerminated() prüfen, um FiberError präventiv zu vermeiden.
Beispiele
FiberError beim Fortsetzen einer beendeten Fiber abfangen
<?php
$fiber = new Fiber(function (): void {
echo "Fiber läuft." . PHP_EOL;
// Fiber endet sofort ohne suspend()
});
$fiber->start(); // Fiber startet und beendet sich
try {
$fiber->resume(); // Fehler: Fiber ist bereits beendet
} catch (FiberError $e) {
echo "FiberError abgefangen: " . $e->getMessage() . PHP_EOL;
}
FiberError durch Zustandsprüfung vermeiden
<?php
$fiber = new Fiber(function (): void {
$wert = Fiber::suspend('erster Wert');
echo "Fortgesetzt mit: " . $wert . PHP_EOL;
});
$fiber->start();
if ($fiber->isSuspended()) {
$fiber->resume('Hallo');
}
// Fiber ist jetzt beendet – resume() sicher vermieden
if ($fiber->isSuspended()) {
$fiber->resume('Nochmal'); // wird nicht ausgeführt
} else {
echo "Fiber ist bereits beendet, kein resume() nötig." . PHP_EOL;
}
// Wichtig · Fallstricke
Vererbungshierarchie: FiberError erbt von Error, nicht von Exception. Globale Exception-Handler oder catch (Exception $e)-Blöcke fangen FiberError nicht ab. Verwende stets catch (FiberError $e) oder catch (\Throwable $e).
Nicht konstruierbar mit sinnvollem Kontext: FiberError wird ausschließlich intern von der PHP-Engine erzeugt; eine manuelle Instanziierung ist technisch möglich, aber unüblich und bedeutungslos.
Präventive Zustandsprüfungen über isStarted(), isSuspended() und isTerminated() sind der empfohlene Weg, um FiberError im Produktivcode zu vermeiden.