Le principe de "try catch" est assez simple. Il s'agit d'essayer "try" de code php et d'attraper (catch) d'éventuelles erreurs ou de créer ses propres erreurs. On appelle cela lancer une Exception car il s'agit en fait de créer une instance de la classe Exception.

 

A quoi cela sert-il ?

Ce mécanisme permet principalement deux choses :

  1. mieux gérer une erreur quand elle survient afin que l'utilisateur final ne se retrouve pas devant un message dont il ne comprend pas le sens
  2. gérer des "erreurs" qui n'en sont pas pour php mais qui sont bien rééelles pour l'utilisateur ou dans la logique de votre application.

Un exemple

Imaginons que l'on ait une fonction très complexe : elle attend deux paramètres et retourne sa somme.

function somme($a, $b) {
  return $a + $b;
}
$result = somme("1","2");
echo( $result . "\n");

Jusqu'ici, pas de problème, echo va bien afficher "3".

Modifions l'appel de cette fonction en fournissant des arguments qui sont de type "chaîne de caractères" :

$result = somme("a","b");
echo( $result . "\n");

Suivant comment est configuré votre server web, vous verrez simplement comme résultat "0". Il sera peut être accompagné d'un "warning".

Dans tous les cas, ce message n'est pas bloquant et l'utilisateur final risque fort de ne pas comprendre qu'il se trouve en face d'un dysfonctionnement.

PHP Warning:  A non-numeric value encountered in /home/yvan/dev/formation/php/testpdo/testpdo.php on line 4

Imaginons qu'il faille absolument que votre fonction "somme" lance une exception (déclenche une erreur) si les arguments fournis ne sont pas numériques afin de bloquer l'exécution de votre code et d'avertir 

Voici comment on pourrait s'y prendre :

function somme($a, $b) {
  if (!is_numeric($a) || !is_numeric($b)) {
    throw new Exception('Erreur de la fonction \"somme\" qui ne peut ajouter des éléments non numériques. Merci de prévenir notre SAV : sav@ma-compagnie.fr'); 
  }
  return $a + $b;
}
try {
  $result = somme("a","b");
  echo( $result . "\n");
} catch(Exception $exception) {
  echo 'Exception attrapée : ', $exception->getMessage();
}