É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
Notez que le code erreur MongoDB (11000) est utilisé pour le code erreur PHP. Le driver
PHP utilise le code erreur natif lorsque c'est possible.
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+.