Signatur
Beschreibung
MongoDB\Driver\Exception\Exception ist das gemeinsame Marker-Interface, das alle Ausnahme-Klassen des MongoDB-Treibers implementieren. Es erweitert das native PHP-Interface \Throwable, sodass sämtliche treiberspezifischen Ausnahmen in einem einzigen catch-Block abgefangen werden können, ohne jede konkrete Ausnahme-Klasse einzeln aufführen zu müssen.
Konkrete Ausnahme-Klassen wie MongoDB\Driver\Exception\ConnectionException, MongoDB\Driver\Exception\AuthenticationException, MongoDB\Driver\Exception\BulkWriteException oder MongoDB\Driver\Exception\RuntimeException implementieren dieses Interface direkt oder über Zwischenstufen. Dadurch lässt sich eine differenzierte Fehlerbehandlung aufbauen: Zunächst spezifische Ausnahmen abfangen, und als letzten Fallback das allgemeine Exception-Interface.
Das Interface ist besonders nützlich in mehrschichtigen Anwendungen oder Bibliotheken, die den MongoDB-Treiber kapseln: Die eigene Abstraktionsschicht kann alle treiberbedingten Fehler einheitlich über catch (\MongoDB\Driver\Exception\Exception $e) erfassen und in anwendungsspezifische Ausnahmen umwandeln, ohne an konkrete Implementierungsdetails des Treibers gebunden zu sein.
Da es sich um ein reines Marker-Interface ohne eigene Methoden handelt, eignet es sich ausschließlich zum Typisieren von catch-Blöcken oder Parameter-Typen, nicht zur direkten Implementierung in eigenen Klassen (außer zur Erweiterung des Ausnahme-Hierarchie-Baums des Treibers).
Beispiele
Alle MongoDB-Treiber-Ausnahmen einheitlich abfangen
<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\Query;
use MongoDB\Driver\Exception\Exception as MongoException;
use MongoDB\Driver\Exception\ConnectionTimeoutException;
try {
$manager = new Manager('mongodb://localhost:27017');
$cursor = $manager->executeQuery('mydb.users', new Query(['active' => true]));
foreach ($cursor as $document) {
var_dump($document);
}
} catch (ConnectionTimeoutException $e) {
// Spezifischer Fehler: Verbindungs-Timeout
echo 'Verbindungs-Timeout: ' . $e->getMessage() . PHP_EOL;
} catch (MongoException $e) {
// Fallback für alle anderen MongoDB-Treiber-Ausnahmen
echo 'MongoDB-Fehler (' . get_class($e) . '): ' . $e->getMessage() . PHP_EOL;
}
MongoDB-Ausnahmen in eigene Abstraktionsschicht einbetten
<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\BulkWrite;
use MongoDB\Driver\Exception\Exception as MongoException;
class UserRepository
{
private Manager $manager;
public function __construct(string $uri)
{
$this->manager = new Manager($uri);
}
/**
* @throws \RuntimeException bei Datenbankfehlern
*/
public function insert(array $userData): void
{
try {
$bulk = new BulkWrite();
$bulk->insert($userData);
$this->manager->executeBulkWrite('mydb.users', $bulk);
} catch (MongoException $e) {
// Treiberspezifische Ausnahme in anwendungseigene umwandeln
throw new \RuntimeException(
'Benutzer konnte nicht gespeichert werden: ' . $e->getMessage(),
(int) $e->getCode(),
$e
);
}
}
}
$repo = new UserRepository('mongodb://localhost:27017');
try {
$repo->insert(['name' => 'Max Mustermann', 'email' => 'max@example.com']);
echo 'Benutzer erfolgreich gespeichert.' . PHP_EOL;
} catch (\RuntimeException $e) {
echo 'Fehler: ' . $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Nur ein Marker-Interface: MongoDB\Driver\Exception\Exception definiert keine eigenen Methoden. Es dient ausschließlich als gemeinsamer Typ für alle Treiber-Ausnahmen und erleichtert catch-Blöcke sowie Typ-Deklarationen.
Nicht zu verwechseln mit der High-Level-Bibliothek mongodb/mongodb (Composer-Paket), die eigene Ausnahme-Hierarchien besitzt. Diese bauen jedoch intern ebenfalls auf den Ausnahmen des C-Erweiterungstreibers (ext-mongodb) auf.
Verfügbarkeit: Das Interface gehört zur PHP-Erweiterung ext-mongodb (PECL-Paket mongodb), nicht zur älteren ext-mongo-Erweiterung. Sicherstellen, dass extension=mongodb in der php.ini aktiviert ist.