Signatur
Beschreibung
Swoole\Exception ist die zentrale Ausnahme-Basisklasse der Swoole-Erweiterung. Sie erweitert die native PHP-Klasse \Exception und dient als gemeinsamer Typ für alle Fehler, die innerhalb des Swoole-Frameworks auftreten können – etwa bei Coroutine-Operationen, asynchronen I/O-Prozessen oder Netzwerkoperationen.
Da Swoole\Exception von \Exception erbt, stehen sämtliche Standard-Methoden wie getMessage(), getCode(), getTrace() und getPrevious() zur Verfügung. Durch das Fangen von Swoole\Exception lassen sich alle swoole-spezifischen Fehler zentral behandeln, ohne jeden einzelnen Ausnahme-Typ separat abfangen zu müssen.
In Swoole-Coroutine-Kontexten ist eine sorgfältige Fehlerbehandlung besonders wichtig, da unbehandelte Ausnahmen in Coroutinen das gesamte Coroutine-Scheduling beeinflussen können. Es empfiehlt sich daher, kritische Coroutine-Blöcke immer mit einem try/catch zu umgeben und mindestens Swoole\Exception abzufangen.
Spezifischere Swoole-Ausnahmen wie Swoole\ExitException leiten sich ebenfalls von dieser Basisklasse ab, sodass ein catch(Swoole\Exception $e)-Block als universeller Auffänger für alle Swoole-Fehler genutzt werden kann.
Beispiele
Swoole-Exception in einer Coroutine abfangen
<?php
use Swoole\Coroutine;
use Swoole\Exception;
Coroutine\run(function () {
try {
// Simuliert eine fehlgeschlagene Swoole-Operation
$client = new Swoole\Coroutine\Http\Client('invalid-host', 9999);
$client->set(['timeout' => 1]);
$result = $client->get('/');
if ($result === false) {
throw new Exception(
'HTTP-Anfrage fehlgeschlagen: ' . $client->errMsg,
$client->errCode
);
}
} catch (Exception $e) {
echo 'Swoole-Fehler abgefangen: ' . $e->getMessage() . PHP_EOL;
echo 'Fehlercode: ' . $e->getCode() . PHP_EOL;
}
});
Eigene Ausnahme von Swoole\Exception ableiten
<?php
use Swoole\Coroutine;
class MeineAnwendungsException extends Swoole\Exception
{
public function __construct(string $message, private string $kontext = '')
{
parent::__construct($message, 0);
}
public function getKontext(): string
{
return $this->kontext;
}
}
Coroutine\run(function () {
try {
throw new MeineAnwendungsException(
'Datenbankverbindung fehlgeschlagen',
'UserRepository::findById'
);
} catch (Swoole\Exception $e) {
// Fängt sowohl Swoole\Exception als auch MeineAnwendungsException
echo 'Fehler: ' . $e->getMessage() . PHP_EOL;
if ($e instanceof MeineAnwendungsException) {
echo 'Kontext: ' . $e->getKontext() . PHP_EOL;
}
}
});
// Wichtig · Fallstricke
Coroutine-Sicherheit: In Swoole-Coroutinen können unbehandelte Ausnahmen dazu führen, dass die betroffene Coroutine still beendet wird, ohne dass andere Coroutinen oder der Haupt-Prozess davon erfahren. Jede Coroutine sollte daher ihren eigenen try/catch-Block besitzen.
Unterschied zu Swoole\Error: Swoole unterscheidet zwischen Swoole\Exception (für laufzeitbedingte, potenziell behebbare Fehler) und Swoole\Error (für schwerwiegende interne Fehler). Für eine vollständige Fehlerbehandlung kann es sinnvoll sein, sowohl Swoole\Exception als auch Swoole\Error abzufangen oder stattdessen \Throwable zu verwenden.
Verfügbarkeit: Swoole\Exception ist nur verfügbar, wenn die Swoole-PHP-Erweiterung installiert und geladen ist. Sie ist kein Bestandteil des PHP-Kerns.