human
En ce qui concerne la gestion des erreurs en PHP - Autant que je sache, il existe 3 styles :

* Style ```die()``` ou ```exit()``` :
```$con = mysql_connect("localhost","root","password");
if (!$con) {
 die('Could not connect: ' . mysql_error());
}
```
* Style ```throw Exception``` :
``` if (!function_exists('curl_init')) {
      throw new Exception('need the CURL PHP extension.
                           Recomplie PHP with curl');
    }
```
* Style ```trigger_error()``` :
```if(!is_array($config) && isset($config)) {
        trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
    }
```

Maintenant, dans le manuel PHP, les trois méthodes sont utilisées.

* Ce que je veux savoir, c'est quel style devrais-je préférer et pourquoi ?
* Est-ce que ces 3 méthodes sont interchangeables et peuvent être utilisées l'une à la place de l'autre ?

Est-ce juste moi ou tout le monde pense que les options de gestion des erreurs en PHP sont trop nombreuses au point de confondre les développeurs PHP
gpt
Le premier ne devrait jamais être utilisé dans le code de production, car il transporte des informations sans rapport avec les utilisateurs finaux (un utilisateur ne peut rien faire concernant "Impossible de se connecter à la base de données").

Vous lancez des Exceptions si vous savez qu'à un certain point critique du code, votre application peut échouer et que vous voulez que votre code récupère à travers plusieurs niveaux d'appels.

```trigger_error()``` vous permet de personnaliser les rapports d'erreurs (en utilisant différents niveaux de messages d'erreur) et vous pouvez masquer ces erreurs aux utilisateurs finaux (en utilisant ```set_error_handler()```) tout en les affichant pendant les tests.

De plus, ```trigger_error()``` peut produire des messages non fatals importants pendant le développement qui peuvent être supprimés dans le code de production en utilisant un gestionnaire d'erreurs personnalisé. Vous pouvez également produire des erreurs fatales (```E_USER_ERROR```) mais celles-ci ne sont pas récupérables. Si vous déclenchez l'une de ces erreurs, l'exécution du programme s'arrête à ce point. C'est pourquoi, pour les erreurs fatales, les Exceptions doivent être utilisées. De cette façon, vous aurez plus de contrôle sur le flux de votre programme :
```// Exemple (pseudo-code pour les requêtes de base de données) :
$db->query('START TRANSACTION');
try {
    while ($row = gather_data()) {
       $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
    }
    $db->query('COMMIT');
} catch(Exception $e) {
    $db->query('ROLLBACK');
}
```
Ici, si ```gather_data()``` échoue (en utilisant ```E_USER_ERROR``` ou ```die()```), il y a une chance que les instructions ```INSERT``` précédentes aient été exécutées dans votre base de données, même si ce n'était pas souhaité, et vous n'auriez aucun contrôle sur ce qui va se passer ensuite.