Signatur
Beschreibung
MongoDB\Driver\Exception\UnexpectedValueException ist eine Ausnahme des MongoDB-PHP-Treibers, die geworfen wird, wenn ein empfangener Wert nicht dem erwarteten Format oder Typ entspricht. Typische Auslöser sind fehlerhafter BSON-Inhalt in einer Server-Antwort, Protokollverstöße oder Situationen, in denen der Cursor oder das Dokument einen Wert enthält, den der Treiber nicht interpretieren kann.
Die Klasse erbt von der SPL-Klasse \UnexpectedValueException und implementiert zusätzlich das Marker-Interface MongoDB\Driver\Exception\Exception, sodass alle treiberspezifischen Ausnahmen einheitlich über dieses Interface abgefangen werden können. Damit lässt sie sich sowohl generisch als auch spezifisch in catch-Blöcken behandeln.
Im Gegensatz zu InvalidArgumentException, die bei falschen Eingabe-Parametern greift, signalisiert UnexpectedValueException Probleme auf der Empfangsseite – also Antworten oder Daten, die der Treiber nicht verarbeiten kann. Dies ist besonders relevant beim Lesen von Cursors, beim Deserialisieren von BSON oder beim Verarbeiten von Serverantworten unter ungewöhnlichen Bedingungen.
Im Fehlerhandling sollte diese Ausnahme abgefangen werden, wenn robuste Anwendungen auch auf inkonsistente oder korrupte Datenbankzustände reagieren müssen.
Beispiele
Gezieltes Abfangen von UnexpectedValueException
<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\Query;
use MongoDB\Driver\Exception\UnexpectedValueException;
use MongoDB\Driver\Exception\Exception as MongoException;
$manager = new Manager('mongodb://localhost:27017');
try {
$cursor = $manager->executeQuery('testdb.collection', new Query([]));
foreach ($cursor as $document) {
var_dump($document);
}
} catch (UnexpectedValueException $e) {
// Unerwarteter Wert in der Server-Antwort oder im BSON
echo 'Unerwarteter Wert vom Server: ' . $e->getMessage() . PHP_EOL;
echo 'Code: ' . $e->getCode() . PHP_EOL;
} catch (MongoException $e) {
// Andere MongoDB-Treiber-Ausnahmen
echo 'MongoDB-Fehler: ' . $e->getMessage() . PHP_EOL;
}
Alle MongoDB-Treiber-Ausnahmen über das gemeinsame Interface fangen
<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\Command;
use MongoDB\Driver\Exception\UnexpectedValueException;
use MongoDB\Driver\Exception\Exception as MongoException;
function runCommand(Manager $manager, string $db, array $command): array
{
try {
$cursor = $manager->executeCommand($db, new Command($command));
return $cursor->toArray();
} catch (UnexpectedValueException $e) {
// Speziell: unerwarteter Wert in der Antwort
error_log(sprintf(
'[MongoDB] UnexpectedValue in DB "%s": %s (Code %d)',
$db,
$e->getMessage(),
$e->getCode()
));
return [];
} catch (MongoException $e) {
// Alle anderen Treiber-Fehler
error_log('[MongoDB] Fehler: ' . $e->getMessage());
return [];
}
}
$manager = new Manager('mongodb://localhost:27017');
$result = runCommand($manager, 'admin', ['ping' => 1]);
var_dump($result);
// Wichtig · Fallstricke
Abgrenzung: UnexpectedValueException betrifft ausschließlich empfangene Werte (Server-Antworten, BSON-Daten), nicht fehlerhafte Eingabe-Parameter. Für Letztere ist MongoDB\Driver\Exception\InvalidArgumentException zuständig.
Vererbungshierarchie: Da die Klasse von der SPL-Klasse \UnexpectedValueException erbt (welche selbst \RuntimeException erweitert), kann sie auch über catch (\RuntimeException $e) abgefangen werden – dies wird jedoch nicht empfohlen, da dadurch Kontext verloren geht.
BSON-Deserialisierung: Beim Einsatz von MongoDB\BSON\toPHP() oder beim Lesen von Cursors kann diese Ausnahme auftreten, wenn das BSON-Dokument Typen enthält, die nicht auf PHP-Objekte gemappt werden können.