Signatur
Beschreibung
MongoDB\Driver\Exception\WriteException ist die Basisklasse für Ausnahmen, die bei fehlgeschlagenen Schreiboperationen gegen eine MongoDB-Datenbank ausgelöst werden. Sie erweitert MongoDB\Driver\Exception\ServerException und bietet zusätzlich Zugriff auf das WriteResult-Objekt, das Informationen über das Ergebnis der Schreiboperation enthält.
Diese Ausnahme wird typischerweise durch ihre Unterklassen BulkWriteException ausgelöst, wenn eine oder mehrere Schreiboperationen in einem Bulk-Write-Vorgang fehlschlagen. Über die Methode getWriteResult() lassen sich detaillierte Informationen über eingefügte, aktualisierte und gelöschte Dokumente abrufen, auch wenn einzelne Operationen fehlgeschlagen sind.
Ein typischer Anwendungsfall ist das Abfangen von Schreibfehlern bei Operationen wie insert, update oder delete, um differenziert auf spezifische Fehlerursachen wie doppelte Schlüssel oder Netzwerkfehler reagieren zu können. Da diese Klasse abstrakt ist, sollte stets die konkrete Unterklasse oder diese Klasse als gemeinsamer Elterntyp im catch-Block verwendet werden.
- BulkWriteException: Wird ausgelöst bei Fehlern in Bulk-Write-Operationen (
Manager::executeBulkWrite()). - Das
WriteResult-Objekt kann auch bei teilweisem Erfolg wertvolle Statusinformationen liefern.
Beispiele
Schreibfehler bei doppeltem Schlüssel abfangen
<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\BulkWrite;
use MongoDB\Driver\Exception\WriteException;
$manager = new Manager('mongodb://localhost:27017');
$bulk = new BulkWrite();
$bulk->insert(['_id' => 1, 'name' => 'Alice']);
$bulk->insert(['_id' => 1, 'name' => 'Bob']); // Doppelter _id-Wert
try {
$result = $manager->executeBulkWrite('testdb.users', $bulk);
echo "Eingefügte Dokumente: " . $result->getInsertedCount() . "\n";
} catch (WriteException $e) {
echo "Schreibfehler: " . $e->getMessage() . "\n";
$writeResult = $e->getWriteResult();
echo "Erfolgreich eingefügt: " . $writeResult->getInsertedCount() . "\n";
// Fehlerdetails aus WriteErrors auslesen
foreach ($writeResult->getWriteErrors() as $writeError) {
echo "Fehler bei Index " . $writeError->getIndex() . ": " . $writeError->getMessage() . "\n";
}
}
Gezielte Fehlerbehandlung nach Fehlercode
<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\BulkWrite;
use MongoDB\Driver\Exception\WriteException;
use MongoDB\Driver\Exception\BulkWriteException;
$manager = new Manager('mongodb://localhost:27017');
$bulk = new BulkWrite(['ordered' => false]);
$bulk->insert(['_id' => 2, 'email' => 'test@example.com']);
$bulk->insert(['_id' => 2, 'email' => 'duplicate@example.com']);
$bulk->insert(['_id' => 3, 'email' => 'new@example.com']);
try {
$manager->executeBulkWrite('testdb.users', $bulk);
} catch (BulkWriteException $e) {
$writeResult = $e->getWriteResult();
echo "Eingefügt: " . $writeResult->getInsertedCount() . " von 3 Dokumenten\n";
foreach ($writeResult->getWriteErrors() as $error) {
// MongoDB-Fehlercode 11000 = DuplicateKey
if ($error->getCode() === 11000) {
echo "Doppelter Schlüssel bei Operation #" . $error->getIndex() . "\n";
}
}
} catch (WriteException $e) {
// Allgemeiner Schreibfehler
echo "Allgemeiner Schreibfehler: " . $e->getMessage() . "\n";
}
// Wichtig · Fallstricke
Ordered vs. Unordered Writes: Bei geordneten Bulk-Writes (ordered: true, Standard) wird die Ausführung beim ersten Fehler abgebrochen. Bei ungeordneten Writes (ordered: false) werden alle Operationen versucht, auch wenn einzelne fehlschlagen. Das WriteResult-Objekt spiegelt dann die tatsächlich ausgeführten Operationen wider.
Sicherheitshinweis: Fehlermeldungen aus getMessage() können serverseitige Informationen wie Feldnamen oder Indexnamen enthalten. Diese sollten nicht ungeprüft an den Endnutzer ausgegeben werden, um keine internen Datenbankstrukturen preiszugeben.
Schreibbelang (Write Concern): WriteException wird auch ausgelöst, wenn der konfigurierte Write Concern nicht erfüllt werden kann, z. B. bei unzureichender Replikation. In diesem Fall liefert getWriteResult()->getWriteConcernError() weitere Informationen.