(PECL mongo >= 1.0.0)
Émise lors d'un accès incorrect à un curseur ou lors de la réception d'une erreur au moment de la réponse. Notez que cette exception peut être émise par n'importe quelle requête de base de données qui reçoit une réponse, et pas uniquement les requêtes. Les commandes d'écriture, et toutes les autres opérations qui envoient des informations à la base de données et attendent une réponse peuvent émettre une exception de type MongoCursorException. La seule exception à ce principe est new MongoClient() (création d'une nouvelle connexion), qui n'émet que des exceptions de type MongoConnectionException.
Cette exception retourne un message d'erreur spécifique pour aider dans le diagnostique du problème ainsi qu'un code erreur numérique associé avec la cause de l'exception.
Par exemple, supposez que vous tentiez d'insérer 2 documents avec le même _id :
<?php
try {
$collection->insert(array("_id" => 1), array("w" => 1));
$collection->insert(array("_id" => 1), array("w" => 1));
}
catch (MongoCursorException $e) {
echo "message d'erreur : ".$e->getMessage()."\n";
echo "code de l'erreur : ".$e->getCode()."\n";
}
?>
message d'erreur : E11000 duplicate key error index: foo.bar.$_id_ dup key: { : 1 } code de l'erreur : 11000
Voici une liste des erreurs, codes et causes survenant le plus fréquemment. Les erreurs exactes sont en italiquue, les erreurs dont le message varie sont décrites en oblique.
cannot modify cursor after beginning iteration
Code : 0
Vous appelez une méthode qui affecte la requête après l'exécuter. Remettez à zéro le curseur et rééssayez.
Un exemple :
<?php
try {
$cursor = $collection->find();
var_dump($cursor->getNext());
// getNext() requête la base de données, il est trop tard pour définir une limite
$cursor->limit(1);
}
catch (MongoCursorException $e) {
echo "message d'erreur : ".$e->getMessage()."\n";
echo "code de l'erreur : ".$e->getCode()."\n";
}
// Ceci fonctionnera :
$cursor->getNext();
$cursor->reset();
$cursor->limit(1);
?>
Get next batch send errors
Code : 1
Ne peut envoyer la requête à la base. Vérifiez l'état su serveur et du réseau.
cursor not found
Code : 2
Le pilote a tenté de récupérer plus de données depuis la base, mais celle-ci n'avait pas assez d'enregistrements. Ceci signifie en général que le curseur a expiré coté serveur après quelques minutes d'inactivité, la base va détruire un curseur. (Voyez MongoCursor::immortal() pour plus d'informations).
Un exemple :
<?php
try {
$cursor = $collection->find();
$cursor->getNext();
// attendre pendant 15 minutes
sleep(60*15);
while ($cursor->hasNext()) {
$cursor->getNext();
}
}
catch (MongoCursorException $e) {
echo "message d'erreur : ".$e->getMessage()."\n";
echo "code de l'erreur : ".$e->getCode()."\n";
}
?>
cursor->buf.pos is null
Code : 3
Ceci peut indiquer que vous n'avez plus de RAM de disponible ou bien d'autres circonstances extraordinaires.
couldn't get response header
Code : 4
Une erreur commune si la base de données ou le réseau n'est plus disponible. Cela signifie que le driver ne peut récupérer une réponse depuis la connexion.
no db response
Code : 5
Ceci n'est pas toujours une erreur, par exemple, la commande "shutdown" émise à la base de données ne retourne aucune réponse. Cependant, si vous attendez une réponse, cela signifie que la base de données n'a pas réussi à la fournir.
bad response length: %d, did the db assert?
Code : 6
Ceci signifie que la base de données dit que sa réponse est inférieure à 0. Cela signifie généralement qu'une erreur réseau ou une corruption de la base de données est survenue.
incomplete header
Code : 7
Très peu commun. Apparait si la réponse de la base commence de manière correcte, mais échoue en plein milieu. Probablement un problème réseau.
incomplete response
Code : 8
Très rare. Survient si la réponse de la base de données a commencé avec succès, mais s'est interrompue avant la fin. Probablement un problème réseau.
couldn't find a response
Code : 9
Si la réponse est en cache mais ne peut être trouvée.
error getting socket
Code : 10
Le socket a été fermé ou a rencontré un problème. Le pilote devrait se reconnecter automatiquement (si possible) lors de l'opération suivante.
couldn't find reply, please try again
Code : 11
Le pilote sauvegarde toutes les réponses de la base qu'il ne peut associer immédiatement à une requête. Cette exception arrive lorsque le pilote a déja passé la réponse à votre requête mais ne peut la trouver dans son cache.
error getting database response: errstr
WSA error getting database response: errstr
"errstr" est une erreur IO, repporté directement depuis le socket C du sous-système. Sous Windows, le message d'erreur est préfixé par "WSA".
Timeout error
Code : 13
Erreur lors de l'attente qu'une requête s'exécute.
couldn't send query: <various>
Code : 14
Erreur de socket C à l'envoi.
max number of retries exhausted, couldn't send query
Code : 19
Le driver retentera automatiquement les requêtes (et non les commandes) un nombre de fois défini si la première tentative échoue pour certaines raisons. Ceci peut produire quelques exceptions lors du jeu de réplication (alors que d'autres passeront normalement), ainsi que quelques erreurs réseaux.
Ceci peut aussi survenir en raison du driver qui n'arrive pas à se reconnecter à la base de données (si, par exemple, la base de données n'est plus joignable).
Version 1.2.2+.
Les erreurs de la base devraient toujours déclencher une MongoCursorExceptions. Les messages d'erreur et les codes sont envoyés directement depuis la base et devraient se retrouver dans le journal de la base de données.
Voici quelques erreurs classiques de base de données:
E11000 duplicate key error index: foo.bar.$X dup key: { /* ... */ }
Code: 11000
Erreur de clé dupliquée.
not master
Codes: 10107, 13435, and 10058
Erreurs not master, pipée vers la base. Chacune causera une déconnection du pilote et sa recherche d'un nouveau primaire. L'erreur en failover peut ne pas être de type "not master", en fonction du déclenchement du changement de primaire.