Niveau d'exception d'erreur PHP 7

不言
Libérer: 2023-03-23 22:28:01
original
2253 Les gens l'ont consulté

Cet article présente le niveau d'exception d'erreur de PHP7, qui a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Niveau d'exception d'erreur PHP 7

.

Explorer la hiérarchie des exceptions dans PHP 7

Dans le passé, il était presque impossible de gérer les erreurs fatales en PHP. Les erreurs fatales terminent simplement l'exécution du script sans appeler le gestionnaire d'erreurs set_error_hander().

En PHP 7, lorsque des erreurs fatales ou récupérables (E_ERROR et E_RECOVERABLE_ERROR) se produisent, l'exception est interceptée au lieu d'abandonner le script. Dans certaines circonstances, des erreurs fatales subsistent, telles qu'une mémoire insuffisante, et le script sera immédiatement terminé comme auparavant. Les exceptions non interceptées sont toujours des erreurs fatales dans PHP 7. Cela signifie qu'une exception non interceptée dans PHP 5.x reste une erreur fatale dans PHP 7.

Notez que les erreurs telles que les avertissements ou les notifications restent inchangées dans PHP 7, seules les erreurs fatales ou récupérables généreront des exceptions.

Le lancement d'erreurs fatales ou récupérables ne s'étend pas à partir de la classe Exception. Cette séparation vise à empêcher le code PHP 5.x existant d'appeler la routine de fin s'il reçoit une exception d'erreur. Les exceptions générées par des erreurs fatales ou récupérables instancieront une nouvelle classe d'exception : Erreur. Comme les autres classes d’exceptions, la classe Error interceptée sera traitée après l’exécution du dernier bloc de programme.

Par rapport à PHP 7 alpha-2, la hiérarchie des classes d'exception de PHP 7 est différente. Les erreurs fatales et récupérables générées seront instanciées dans la classe EngineException, et la classe EnginException n'hérite pas d'Exception. . Exception et EngineException héritent de BaseException.

Throwable

Afin de combiner ces deux branches d'exception, Exception et Error implémentent une nouvelle interface, Throwable.

La nouvelle hiérarchie des exceptions dans PHP 7 est la suivante :

Throwable //(接口)
    |- Exception implements Throwable
        |- ...
    |- Error implements Throwable
        |- TypeError extends Error 
        |- ParseError extends Error // 编译时错误
        |- ArithmeticError extends Error
            |- pisionByZeroError extends ArithmeticError
        |- AssertionError extends Error
Copier après la connexion

Si vous définissez l'interface Throwable dans PHP 7, elle devrait être similaire au code ci-dessous.

interface Throwable{
    public function getMessage(): string;
    public function getCode(): int;
    public function getFile(): string;
    public function getLine(): int;
    public function getTrace(): array;
    public function getTraceAsString(): string;
    public function getPrevious(): Throwable;
    public function __toString(): string;}
Copier après la connexion

Cette interface devrait être familière. Les méthodes spécifiques au throwable sont les mêmes que celles d'exception. La seule différence est que Throwable::getPrevious() renverra une exception Throwable et le constructeur de la classe Error recevra une instance de Throwable comme exception précédente.

Throwable peut être utilisé pour intercepter des exceptions ou des objets d'erreur dans les blocs try/catch (d'autres types d'exceptions pourraient être interceptés à l'avenir). N'oubliez pas qu'il est recommandé ici de capturer des classes d'exceptions plus spécifiques et de prendre les mesures de traitement appropriées. Cependant, dans certains cas, il est nécessaire de détecter les exceptions de manière générale (telles que la journalisation ou la gestion des erreurs du framework). En PHP 7, ces blocs de capture d'exceptions sont plus adaptés pour utiliser Throwable au lieu d'Exception.

try {    // Code that may throw an Exception or Error.} catch (Throwable $t) {    // Handle exception}
Copier après la connexion

Les classes personnalisées ne peuvent pas implémenter de plug-ins Throwable, en partie à cause de la prévisibilité et de la cohérence : seule l'instanciation des classes Excetion et Error peut lever des exceptions. De plus, l'exception contient des informations sur l'objet créé sur la pile. Les classes personnalisées n'ont pas automatiquement de paramètres contenant des informations.

Throwable peut être étendu pour créer des interfaces spécifiques au package ou ajouter des méthodes supplémentaires. Seules les classes qui héritent d'Exception ou d'Erreur peuvent implémenter des plug-ins qui étendent Throwable.

interface MyPackageThrowable extends Throwable {}class MyPackageException extends Exception implements MyPackageThrowable {}throw new MyPackageException();
Copier après la connexion

Erreur

En PHP 5. et versions antérieures, toutes les erreurs sont des erreurs fatales ou des erreurs fatales récupérables, tandis qu'en PHP 7, toutes les erreurs sont renvoyées. Comme d’autres exceptions, les objets Error peuvent être interceptés via des blocs try/catch.

$var = 1;try {
    $var->method(); // Throws an Error object in PHP 7.} catch (Error $e) {    // Handle error}
Copier après la connexion

Habituellement, les erreurs fatales précédentes lanceront une instanciation de la classe de base Error, mais certaines erreurs lanceront des sous-classes Error plus spécifiques : TypeError, ParseError et AssertionError.

TypeError (erreur de type)

L'instanciation TypeError est générée par les paramètres réels et les paramètres formels Lorsque la fonction est appelée, les paramètres formels et les types de paramètres réels déclarés sont incohérents (paramètres et méthodes entrants). ) Les types de paramètres définis sont incohérents) lancera une instance TypeError.

function add(int $left, int $right){
    return $left + $right;
}try {    $value = add('left', 'right');
} catch (TypeError $e) {    echo $e->getMessage(), "\n";
}
Copier après la connexion

Résultat résultant :

Argument 1 passed to add() must be of the type integer, string given
Copier après la connexion

ParseError (erreur d'analyse)

Lorsque le fichier inclus/requis ou le code dans eval() contient une erreur de syntaxe , ParseError sera lancé.

try {    require 'file-with-parse-error.php';
} catch (ParseError $e) {    echo $e->getMessage(), "\n";
}
Copier après la connexion

ArithmeticError (erreur arithmétique)

Lance ArithmeticError Il existe deux cas d'erreurs : un déplacement négatif, ou l'utilisation de PHP_INT_MIN comme numérateur et -1 comme dénominateur pour appeler intp(). (PHP_INI_MIN / -1 La valeur de retour est un type à virgule flottante).

try {    $value = 1 << -1;
} catch (ArithmeticError $e) {    echo $e->getMessage(), "\n";
}
Copier après la connexion

pisionByZeroError (le dénominateur est zéro)

L'utilisation de intp() ou du reste (%) lorsque le dénominateur est zéro générera une erreur pisionByZeroError. Notez que la division par zéro provoque uniquement un avertissement et est évaluée à NaN.

try {    $value = 1 % 0;
} catch (pisionByZeroError $e) {    echo $e->getMessage(), "\n";
}
Copier après la connexion

AssertionError (Assertion)

Lorsque les conditions définies par assert() ne sont pas remplies, une AssertionError sera levée.

ini_set(&#39;zend.assertions&#39;, 1);
ini_set(&#39;assert.exception&#39;, 1);$test = 1;

assert($test === 0);
Copier après la connexion

Si les conditions définies par assert() ne sont pas remplies, une AssertionError est levée et assert.exception = 1. Le résultat de l'exception est le suivant :

Fatal error: Uncaught AssertionError: assert($test === 0)
Copier après la connexion

assert () n'est exécuté et ne lancera une AssertionError que si les assertions sont activées et définies pour lancer des exceptions avec les paramètres ini zend.assertions = 1 et assert.exception = 1.

使用 Error

用户可以创建自己的 Error 类,作为 Error 基类的拓展。这可能带来重要的问题:什么场合下应该抛出一个 Exception 类的子类实例,什么场合下又应该抛出 Error 类的子类实例?

由于错误对象不应当在程序运行中处理,捕获错误对象应当是少见的。通常而言,错误对象应当捕获并记录之,执行必要的清理,并给用户展示错误信息。

编写兼容 PHP 5.x 和 7 Exceptions 类的代码

在 PHP 5.x 和 7 使用相同的代码捕获异常,可以实用多重捕获代码块,首先捕获 Throwable,之后时 Exception。一旦不需要维护 PHP 5.x 的系统,代码块可以立刻被清理掉。

try {    // Code that may throw an Exception or Error.} catch (Throwable $t) {    // Executed only in PHP 7, will not match in PHP 5.x} catch (Exception $e) {    // Executed only in PHP 5.x, will not be reached in PHP 7}
Copier après la connexion

英文原文: trowski.com/2015

本文虽拙,却也系作者劳动,转载还请保留本文链接: http://cyleft.com/?p=721

相关推荐:

php错误级别详解

PHP错误与异常调试视频教程资源分享

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!