Signatur
Beschreibung
Yar_Server_Protocol_Exception ist eine spezialisierte Ausnahme innerhalb des Yar-RPC-Frameworks (Yet Another RPC Framework) für PHP. Sie wird ausgelöst, wenn der Yar-Server einen eingehenden RPC-Aufruf empfängt, dessen Protokoll nicht korrekt interpretiert werden kann – etwa wenn das Datenpaket beschädigt ist, das verwendete Paketformat unbekannt ist oder die Protokollversion nicht unterstützt wird.
Die Klasse erbt von Yar_Server_Exception, welche wiederum von der Standard-PHP-Klasse Exception abstammt. Dadurch stehen alle bekannten Methoden wie getMessage(), getCode() und getTrace() zur Verfügung.
In der Praxis sollte diese Ausnahme auf der Serverseite abgefangen werden, um Protokollfehler gezielt behandeln und von anderen RPC-Fehlern unterscheiden zu können. Typische Ursachen sind inkompatible Client-Versionen, fehlerhafte Serialisierungsformate oder manipulierte Anfragen.
- Protokollinkompatibilität: Client und Server verwenden unterschiedliche Yar-Protokollversionen.
- Ungültiges Paket: Das empfangene Datenpaket entspricht nicht dem erwarteten Yar-Format.
- Nicht unterstützter Packer: Der angeforderte Serializer (z. B. JSON, Msgpack) ist serverseitig nicht verfügbar.
Beispiele
Protokollfehler auf dem Yar-Server abfangen
<?php
// server.php
class MathService
{
public function add(int $a, int $b): int
{
return $a + $b;
}
}
try {
$server = new Yar_Server(new MathService());
$server->handle();
} catch (Yar_Server_Protocol_Exception $e) {
// Protokollfehler gezielt behandeln
error_log('Yar Protokollfehler: ' . $e->getMessage() . ' (Code: ' . $e->getCode() . ')');
http_response_code(400);
echo 'Protokollfehler: Ungültiges oder inkompatibles RPC-Paket.';
} catch (Yar_Server_Exception $e) {
// Allgemeinen Yar-Serverfehler behandeln
error_log('Yar Serverfehler: ' . $e->getMessage());
} catch (Exception $e) {
error_log('Allgemeiner Fehler: ' . $e->getMessage());
}
Unterscheidung verschiedener Yar-Serverausnahmen
<?php
// Beispiel zur Veranschaulichung der Ausnahme-Hierarchie
function handleYarException(Yar_Server_Exception $e): void
{
if ($e instanceof Yar_Server_Protocol_Exception) {
echo 'Protokollfehler erkannt: ' . $e->getMessage() . PHP_EOL;
echo 'Fehlercode: ' . $e->getCode() . PHP_EOL;
} elseif ($e instanceof Yar_Server_Request_Exception) {
echo 'Anfragefehler erkannt: ' . $e->getMessage() . PHP_EOL;
} else {
echo 'Allgemeiner Yar-Serverfehler: ' . $e->getMessage() . PHP_EOL;
}
}
// Im realen Betrieb würde diese Ausnahme vom Yar-Server selbst geworfen;
// hier zur Demonstration manuell erzeugt:
try {
throw new Yar_Server_Protocol_Exception('Unsupported packager', YAR_ERR_PROTOCOL);
} catch (Yar_Server_Exception $e) {
handleYarException($e);
}
// Wichtig · Fallstricke
Sicherheitshinweis: Protokollfehler können auch durch absichtlich manipulierte Anfragen ausgelöst werden. Es empfiehlt sich, detaillierte Fehlermeldungen nur intern zu protokollieren und dem Client lediglich eine generische Fehlermeldung zurückzugeben, um keine internen Implementierungsdetails preiszugeben.
Verfügbarkeit: Die Klasse ist nur verfügbar, wenn die Yar-PECL-Erweiterung installiert ist. Die genauen Fehlercodes (z. B. YAR_ERR_PROTOCOL) sind als Konstanten der Yar-Erweiterung definiert und können je nach Version variieren.
Hinweis zur Vererbung: Da Yar_Server_Protocol_Exception von Yar_Server_Exception erbt, kann sie mit einem allgemeinen catch(Yar_Server_Exception $e)-Block abgefangen werden. Für eine spezifische Behandlung sollte der spezialisierte Block jedoch zuerst stehen.