Modification du mécanisme de gestion des erreurs


1. Il existe désormais deux classes d'exception : Exception et Error

PHP7 a désormais deux classes d'exception, Exception et Error. Les deux classes implémentent une nouvelle interface : Throwable. Dans votre code de gestion des exceptions, les indications de type devront peut-être être ajustées.

2. Certaines erreurs fatales et erreurs fatales récupérables sont modifiées pour lancer des objets Error.

Certaines erreurs fatales et erreurs fatales récupérables sont désormais signalées en tant qu'objets d'erreur. Les objets d'erreur sont indépendants de l'exception et ne peuvent pas être interceptés par un try/catch normal. Note de l'éditeur : vous devez enregistrer une fonction de gestion des erreurs, veuillez vous référer à la RFC ci-dessous.

Ces erreurs fatales récupérables qui se sont transformées en exceptions ne peuvent plus être ignorées silencieusement via le gestionnaire d'erreurs. En particulier, les erreurs d’indication de type ne peuvent être ignorées.

3. Les erreurs de syntaxe lanceront un objet ParseError

Les erreurs de syntaxe lanceront un objet ParseError, qui hérite de l'objet Error. Lors de la manipulation de eval() auparavant, en plus de vérifier la valeur de retour ou error_get_last() pour le code potentiellement sujet aux erreurs, vous devez également capturer l'objet ParseError.

4. La méthode de construction des objets internes lèvera toujours une exception en cas d'échec.

La méthode de construction des objets internes lèvera toujours une exception en cas d'échec. Certains constructeurs précédents renvoyaient NULL ou un objet inutilisable.

5. Les niveaux de certaines erreurs E_STRICT ont été ajustés.


Gestion des erreurs PHP 7

PHP 7 modifie la façon dont la plupart des erreurs sont signalées. Contrairement au mécanisme traditionnel de rapport d'erreurs de PHP 5, la plupart des erreurs sont désormais générées en tant qu'exceptions d'erreur.

Ce type d'exception d'erreur peut être intercepté par un bloc try/catch comme une exception normale. S'il n'y a pas de bloc try/catch correspondant, La fonction de gestion des exceptions (enregistrée par set_exception_handler()) est appelée pour le traitement. Si un gestionnaire d'exceptions n'a pas été enregistré, il est traité de manière traditionnelle : il est signalé comme une erreur fatale.

La classe Error n'est pas étendue à partir de la classe Exception, donc un code comme catch (Exception $e) { ... } ne peut pas être intercepté à l'erreur. Vous pouvez utiliser du code comme catch (Error $e) { ... } ou en enregistrant un gestionnaire d'exceptions ( set_exception_handler()) pour détecter l'erreur.

Hiérarchie des exceptions d'erreur

1.Erreur ​

  • ErreurArithmétique Surerreurd'assertion SurDivisionparzéroerreur OuPARSEERROR OuTypeerreur ​

  • 2.Exception


  • ...


  • 1458887252-2773-exception-hiearchy.jpg

    Exemple

    <?php
    class MathOperations 
    {
       protected $n = 10;
       // 求余数运算,除数为 0,抛出异常
       public function doOperation(): string
       {
          try {
             $value = $this->n % 0;
             return $value;
          } catch (DivisionByZeroError $e) {
             return $e->getMessage();
          }
       }
    }
    $mathOperationsObj = new MathOperations();
    print($mathOperationsObj->doOperation());
    ?>

    Le résultat de sortie de l'exécution du programme ci-dessus est :

    Modulo by zero

    Exceptions PHP 7

    Exceptions PHP 7 sont utilisés pour réduire la compatibilité et améliorer l’ancienne fonction assert(). Il permet des assertions sans coût dans les environnements de production et offre la possibilité de générer des exceptions et des erreurs personnalisées.

    L'ancienne version de l'API continuera d'être maintenue à des fins de compatibilité, assert() est désormais une construction de langage, qui permet au premier paramètre d'être une expression, pas seulement une chaîne à calculer ou un booléen à tester.

    configuration assert()

    Élément de configuration
    Valeur par défaut
    Valeur facultative
    zend.assertions1
    • 1 - Générer et exécuter du code (mode développement)

    • 0 - Générer du code, mais l'ignorer lors de l'exécution 1 - Lancé lorsqu'une assertion échoue, un objet d'exception peut être levé ou une instance d'objet AssertionError est levée si aucune exception n'est fournie.

    • 0 - Utilisez ou générez Throwable, générez simplement des avertissements basés sur des objets au lieu de lancer des objets (compatible avec PHP 5)

    paramètres

    assertion

    assertion. En PHP 5, une chaîne pour l'exécution ou un booléen pour les tests. En PHP 7, il peut s'agir d'une expression qui renvoie n'importe quelle valeur, et le résultat sera utilisé pour indiquer si l'assertion a réussi.

    description

    Si l'assertion échoue, la description de l'option sera incluse dans le message d'échec.

    exception

    En PHP 7, le deuxième paramètre peut être un objet Throwable au lieu d'une chaîne, qui sera levée si l'assertion échoue et que assert.exception est activé. Instance

    <?php
    ini_set('zend.assertions', 0);
    assert(true == false);
    echo 'Hi!';
    ?>
    Le résultat de sortie de l'exécution du programme ci-dessus est :
    Hi!