Signatur
Beschreibung
ZMQSocketException ist eine spezialisierte Ausnahmeklasse aus der ZMQ-Erweiterung (ZeroMQ für PHP). Sie wird geworfen, sobald eine Operation auf einem ZMQSocket-Objekt fehlschlägt – etwa wenn ein Socket nicht gebunden oder verbunden werden kann, eine Nachricht nicht gesendet werden kann oder ein ungültiger Socket-Typ angegeben wurde.
Die Klasse erbt von ZMQException, welche selbst von der eingebauten Exception-Klasse ableitet. Damit stehen alle Standard-Methoden wie getMessage(), getCode() und getTrace() zur Verfügung. Der Fehlercode entspricht in der Regel einem ZMQ-Fehlercode (errno), der detaillierten Aufschluss über die Ursache des Fehlers gibt.
Es empfiehlt sich, ZMQSocketException in einem try/catch-Block gezielt abzufangen, um robuste Messaging-Anwendungen zu schreiben. Da ZMQ-Sockets nicht Thread-sicher sind und viele netzwerkbezogene Fehler auftreten können, ist eine präzise Fehlerbehandlung auf Socket-Ebene besonders wichtig.
Im Vergleich zu ZMQContextException oder ZMQPollException ist ZMQSocketException auf Fehler beschränkt, die direkt an einem Socket entstehen – also beim Binden, Verbinden, Senden, Empfangen oder beim Setzen von Socket-Optionen.
Beispiele
Verbindungsfehler eines ZMQSocket abfangen
<?php
try {
$context = new ZMQContext();
$socket = new ZMQSocket($context, ZMQ::SOCKET_REQ);
// Ungültige Adresse, um einen Fehler zu provozieren
$socket->connect('ungültige-adresse');
} catch (ZMQSocketException $e) {
echo 'ZMQSocket-Fehler: ' . $e->getMessage() . PHP_EOL;
echo 'Fehlercode: ' . $e->getCode() . PHP_EOL;
}
Fehlerbehandlung beim Senden einer Nachricht
<?php
try {
$context = new ZMQContext();
$socket = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$socket->bind('tcp://127.0.0.1:5555');
// Senden ohne verbundenen Empfänger (non-blocking)
$socket->send('Hallo ZeroMQ', ZMQ::MODE_NOBLOCK);
echo 'Nachricht gesendet.' . PHP_EOL;
} catch (ZMQSocketException $e) {
echo 'Fehler beim Senden: ' . $e->getMessage() . PHP_EOL;
echo 'ZMQ-Fehlercode: ' . $e->getCode() . PHP_EOL;
}
// Wichtig · Fallstricke
Fehlercode-Interpretation: Der von getCode() zurückgegebene Wert entspricht dem systemeigenen errno-Wert, den ZeroMQ intern verwendet. Eine Übersicht der Fehlercodes findet sich in der ZeroMQ-API-Dokumentation.
Abgrenzung zu anderen ZMQ-Ausnahmen: Die ZMQ-Erweiterung kennt mehrere Ausnahmeklassen (ZMQContextException, ZMQSocketException, ZMQPollException, ZMQDeviceException). Es empfiehlt sich, diese gezielt – und nicht nur das gemeinsame ZMQException – abzufangen, um zwischen verschiedenen Fehlerquellen unterscheiden zu können.
Nicht-blockierender Modus: Bei Verwendung von ZMQ::MODE_NOBLOCK wird bei temporärer Nichtverfügbarkeit eine ZMQSocketException mit Fehlercode EAGAIN (11) geworfen, anstatt zu blockieren. Dies muss im Anwendungscode explizit behandelt werden.