Start · Sprachen · PHP · Referenz · MongoDB\Driver\Exception\WriteException

MongoDB\Driver\Exception\WriteException

Klasse

Wird ausgelöst, wenn eine Schreiboperation gegen MongoDB fehlschlägt und enthält detaillierte Informationen über das Schreibergebnis.

seit PHP 1.0.0 Kategorie: error

Signatur

class WriteException extends ServerException

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";
    }
}
Schreibfehler: Bulk write failed Erfolgreich eingefügt: 1 Fehler bei Index 1: E11000 duplicate key error ...

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";
}
Eingefügt: 2 von 3 Dokumenten Doppelter Schlüssel bei Operation #1

// 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.