Cours 16 - Gestion des exceptions

Objectifs

Déroulement

  1. Introduction
  2. C'est quoi une exception?
  3. Faire exercice 16

C'est quoi une exception?

Comment fonctionnent les exceptions ?

En PHP, une exception est lancée (thrown) avec le mot-clé throw suivi d'un objet Exception. Une fois qu'une exception est lancée, le script s'arrête et saute à la première correspondance de bloc catch qui peut gérer cette exception.

Voici la syntaxe de base pour utiliser les exceptions :

<?php
try {
    // Code qui peut générer une exception
    throw new Exception("Un message d'erreur");
} catch (Exception $e) {
    // Code pour gérer l'exception
    echo "Exception capturée : " . $e->getMessage();
}
?>

Quand utiliser une exception?

Les exceptions sont utilisées pour gérer des situations exceptionnelles dans votre code, où le flux normal d'exécution ne peut pas continuer en raison d'un problème.

Lance une exception n'importe où dans le code

Exemple concret

<?php
function obtenirMoyenne( $note1,  $note2) {
  if (!is_numeric($note1) || !is_numeric($note2)) {
    // On lance une nouvelle exception grâce à throw et on instancie directement un objet de la classe Exception.
    throw new Exception('Les deux paramètres doivent être des nombres!');
  }

  return ($note1 + $note2) / 2;
}

//il manque ici le block try catch! 
echo obtenirMoyenne(12, -3), '<br />';
echo obtenirMoyenne('azerty', 54), '<br />'; // => va généré une erreur fatale ici
echo obtenirMoyenne(4, 8);
?>

Attraper une exception

bloc try => pour faire nos opération et essais
bloc catch => pour attraper l'erreur on fait quoi avec?

<?php
try{ // On va essayer d'effectuer les instructions situées dans ce bloc.
    echo obtenirMoyenne(12, -3), '<br />';
    echo obtenirMoyenne('azerty', 54), '<br />';
    echo obtenirMoyenne(4, 8);
} catch (Exception $e) { // On va attraper les exceptions "Exception" s'il y en a une qui est levée.
    echo 'Une exception a été lancée. Message d\'erreur : ', $e->getMessage();
}
?>

Autres types d'exceptions

Il y a déjà des types d'exceptions

Retour sur l'exception PDOException

<?php
try {
  $db = new PDO('mysql:host=localhost;dbname=tests', 'root', ''); // Tentative de connexion.
  echo 'Connexion réussie !'; // Si la connexion a réussi, alors cette instruction sera exécutée.
} catch (PDOException $e) { // On attrape les exceptions PDOException.
  echo 'La connexion a échoué.<br />';
  echo 'Informations : [', $e->getCode(), '] ', $e->getMessage(); // On affiche le n° de l'erreur ainsi que le message.
}
?>

Mot clé finally

PHP 5.5 a introduit le bloc finally, qui existe déjà dans d'autres langages, et qui sert à contenir du code qui est toujours exécuté, qu'on passe dans le try ou dans le catch :

<?php
finally
{
  echo "Action effectuée quoi qu'il arrive";
}
?>

En résumé