web-dev-qa-db-fra.com

Lancer des exceptions dans un PHP Essayez le bloc de capture

J'ai une fonction PHP dans un fichier Drupal 6 .module. J'essaie d'exécuter des validations de variable initiales avant d'exécuter des tâches plus intensives (telles que des requêtes de base de données). En C #, j'avais l'habitude d'implémenter des instructions IF au début de mon bloc Try qui lançait de nouvelles exceptions en cas d'échec de la validation. L'exception levée serait interceptée dans le bloc Catch. Voici mon code PHP:

function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    throw $e->getMessage();
  }
}

Cependant, lorsque j'essaie d'exécuter le code, cela me dit que les objets ne peuvent être lancés que dans le bloc Catch.

Merci d'avance!

61
kaspnord
function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    /*
        Here you can either echo the exception message like: 
        echo $e->getMessage(); 

        Or you can throw the Exception Object $e like:
        throw $e;
    */
  }
}
94
AlienWebguy

À renvoyer faire 

 throw $e;

pas le message.

57
Chen Kinnrot

Supprimez simplement la throw du bloc catch - changez-la en une echo ou gérez sinon l'erreur.

Cela ne vous dit pas que les objets ne peuvent être lancés que dans le bloc catch, mais plutôt que seuls les objets peuvent être projetés et que l'emplacement de l'erreur est dans le bloc catch - il y a une différence.

Dans le bloc d'arrêt, vous essayez de lancer quelque chose que vous venez de prendre - ce qui dans ce contexte n'a pas beaucoup de sens - et ce que vous essayez de lancer est une ficelle.

Une analogie concrète avec ce que vous faites est d’attraper une balle, puis d’essayer de lancer le logo du fabricant ailleurs. Vous pouvez uniquement lancer un objet entier, pas une propriété de l'objet.

15
DaveRandom
throw $e->getMessage();

Vous essayez de jeter une string

En résumé, les exceptions consistent généralement à définir des états exceptionnels de l'application et non des messages d'erreur après validation. Ce n'est pas une exception, lorsqu'un utilisateur vous donne des données non valides

3
KingCrunch

Throw nécessite un objet instancié par \Exception. Seul le $e attrapé peut jouer le tour.

throw $e
0
Goms