PHP 5.6.0beta1 released

La classe MongoCursorException

(PECL mongo >= 1.0.0)

Introduction

É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";
}

?>
Ceci affichera quelque chose comme :
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+.

Erreur de la base de données

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.

Synopsis de la classe

MongoCursorException extends MongoException {
}

Sommaire

add a note add a note

User Contributed Notes 1 note

up
1
Loc d&#39;Anterroches
2 years ago
As all the exceptions are extending the base Exception class, you can get the code with the getCode() method:

<?php
try {
   
$collection->insert($duplicate_document, array('safe' => true));
} catch (
MongoCursorException $e) {
   
printf("Error code is %d.\n", $e->getCode();
    exit(
1);
}
To Top