Start · Sprachen · PHP · Referenz · FiberError

FiberError

Klasse

Wird geworfen, wenn eine ungültige Operation auf einer <code>Fiber</code> durchgeführt wird, z. B. Fortsetzen einer bereits beendeten Fiber.

seit PHP 8.1.0 Kategorie: error

Signatur

class FiberError extends Error

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;
}
Fiber läuft. FiberError abgefangen: Cannot resume a terminated fiber

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;
}
Fortgesetzt mit: Hallo Fiber ist bereits beendet, kein resume() nötig.

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

Siehe auch