Maison  >  Article  >  développement back-end  >  Mécanisme de gestion des exceptions de php5 et php7 (analyse de la gestion des exceptions thinkphp5)

Mécanisme de gestion des exceptions de php5 et php7 (analyse de la gestion des exceptions thinkphp5)

藏色散人
藏色散人avant
2019-03-28 13:31:303807parcourir

Cet article présente principalement le mécanisme de gestion des exceptions de php5 et php7 (analyse de la gestion des exceptions thinkphp5). J'espère qu'il sera utile aux amis dans le besoin !

Exceptions et erreurs 1.php

Dans d'autres langues, les exceptions et les erreurs sont différentes, mais PHP déclenchera une erreur lorsqu'il rencontrera sa propre erreur au lieu de lancer. une exception. De plus, dans la plupart des cas, PHP déclenchera une erreur et mettra fin à l'exécution du programme. En PHP5, try catch n'a aucun moyen de gérer les erreurs.

php7 peut détecter les erreurs ;

1.1 exception d'erreur php5

// 1.异常处理
try{
  throw new Exception("Error Processing Request", 1);
}catch ( Exception $e){
  echo $e->getCode().'076402276aae5dbec7f672f8f4e5cc81';
  echo $e->getMessage().'076402276aae5dbec7f672f8f4e5cc81';
  echo $e->getLine().'076402276aae5dbec7f672f8f4e5cc81';
  echo $e->getFile().'076402276aae5dbec7f672f8f4e5cc81';
}

返回:

1
Error Processing Request
158
E:\phpwebenv\PHPTutorial\WWW\test\index.php

// 2.结果php错误处理机制
function MyErrorHandler($error,$errstr,$errfile,$errline){
echo 'a4b561c25d9afb9ac8dc4d70affff419 Custom error:0d36329ec37a2cc24d42c7229b69747a'.$error.':'.$errstr.'076402276aae5dbec7f672f8f4e5cc81';
echo "Error on line $errline in ".$errfile;
}
set_error_handler('MyErrorHandler',E_ALL|E_STRICT);
try{
// throw new Exception("Error Processing Request", 4);
  trigger_error('error_msg');
}catch ( Exception $e){
  echo $e->getCode().'076402276aae5dbec7f672f8f4e5cc81';
  echo $e->getMessage().'076402276aae5dbec7f672f8f4e5cc81';
  echo $e->getLine().'076402276aae5dbec7f672f8f4e5cc81';
  echo $e->getFile().'076402276aae5dbec7f672f8f4e5cc81';
}

结果:
Custom error:1024:error_msg
Error on line 164 in E:\phpwebenv\PHPTutorial\WWW\test\index.php

//3. 处理致命错误:脚本结束后执行
function shutdown_function(){
  $e = error_get_last();
  echo '0141e64b460264de306a9735a1994788';
  var_dump($e);
}
register_shutdown_function('shutdown_function');
try{
// throw new Exception("Error Processing Request", 4);
// trigger_error('error_msg');
  fun();
}catch ( Exception $e){
  echo $e->getCode().'076402276aae5dbec7f672f8f4e5cc81';
  echo $e->getMessage().'076402276aae5dbec7f672f8f4e5cc81';
  echo $e->getLine().'076402276aae5dbec7f672f8f4e5cc81';
  echo $e->getFile().'076402276aae5dbec7f672f8f4e5cc81';
}

结果:

Fatal error: Uncaught Error: Call to undefined function fun() in E:\phpwebenv\PHPTutorial\WWW\
test\index.php:172 Stack trace: #0 {main} thrown in E:\phpwebenv\PHPTutorial\WWW\test\index.php on line 172
array(4) {
  ["type"]=>
  int(1)
  ["message"]=>
  string(131) "Uncaught Error: Call to undefined function fun() in E:\phpwebenv\PHPTutorial\WWW\test\index.php:172
Stack trace:
#0 {main}
  thrown"
  ["file"]=>
  string(43) "E:\phpwebenv\PHPTutorial\WWW\test\index.php"
  ["line"]=>
  int(172)
}
以上方法可以看出,php没有捕获到异常,只能依赖set_error_handler()和register_shutdown_function();来处理,set_error_handler只能接受
异常和非致命的错误。register_shutdown_function():主要针对die()或致命错误,即程序终结后执行;所以php5没有很好的异常处理机制。

1.2 gestion des exceptions php7

// 处理致命错误:脚本结束后执行
function shutdown_function(){
    $e = error_get_last();
    echo 'e03b848252eb9375d56be284e690e873';
    var_dump($e);
}
register_shutdown_function('shutdown_function');
// 结果php错误处理机制
function MyErrorHandler($error,$errstr,$errfile,$errline){
    echo 'a4b561c25d9afb9ac8dc4d70affff419 Custom error:0d36329ec37a2cc24d42c7229b69747a'.$error.':'.$errstr.'076402276aae5dbec7f672f8f4e5cc81';
    echo "Error on line $errline in ".$errfile;
}
set_error_handler('MyErrorHandler',E_ALL|E_STRICT);
try{
    // throw new Exception("Error Processing Request", 4);
    // trigger_error('error_msg');
    fun();
}catch ( Error $e){
    echo $e->getCode().'076402276aae5dbec7f672f8f4e5cc81';
    echo $e->getMessage().'076402276aae5dbec7f672f8f4e5cc81';
    echo $e->getLine().'076402276aae5dbec7f672f8f4e5cc81';
    echo $e->getFile().'076402276aae5dbec7f672f8f4e5cc81';
}
结果:
0
Call to undefined function fun()
172
E:\phpwebenv\PHPTutorial\WWW\test\index.php
NULL  
register_shutdown_function();没有捕获到异常
// 2. 如果不用try catch 捕获

function exception_handler( Throwable $e){

    echo &#39;catch Error:&#39;.$e->getCode().&#39;:&#39;.$e->getMessage().&#39;<br/>&#39;;


}

set_exception_handler(&#39;exception_handler&#39;);

fun();

Résumé : Throwable est la classe de base d'Erreur et d'Exception en php7, si vous voulez intercepter les exceptions, vous devez intercepter les erreurs

try{
    fun();
}catch ( Throwable $e){
    echo $e->getCode().'076402276aae5dbec7f672f8f4e5cc81';
    echo $e->getMessage().'076402276aae5dbec7f672f8f4e5cc81';
    echo $e->getLine().'076402276aae5dbec7f672f8f4e5cc81';
    echo $e->getFile().'076402276aae5dbec7f672f8f4e5cc81';
}

3. thinkphp5. Gestion des erreurs du framework :

 在异常错误处理类:Error有这个处理  
// 注册错误和异常处理机制
\think\Error::register();
 /**
     * 注册异常处理
     * @return void
     */
    public static function register()
    {
        error_reporting(E_ALL);
        set_error_handler([__CLASS__, 'appError']);
        set_exception_handler([__CLASS__, 'appException']);
        register_shutdown_function([__CLASS__, 'appShutdown']);
    }
当程序出现错误时,会执行这些异常、错误的函数;

Après connexion à la base de données, la gestion des exceptions est :

/**
     * 连接数据库方法
     * @access public
     * @param array         $config 连接参数
     * @param integer       $linkNum 连接序号
     * @param array|bool    $autoConnection 是否自动连接主数据库(用于分布式)
     * @return PDO
     * @throws Exception
     */
    public function connect(array $config = [], $linkNum = 0, $autoConnection = false)
    {
        if (!isset($this->links[$linkNum])) {
            if (!$config) {
                $config = $this->config;
            } else {
                $config = array_merge($this->config, $config);
            }
            // 连接参数
            if (isset($config[&#39;params&#39;]) && is_array($config[&#39;params&#39;])) {
                $params = $config[&#39;params&#39;] + $this->params;
            } else {
                $params = $this->params;
            }
            // 记录当前字段属性大小写设置
            $this->attrCase = $params[PDO::ATTR_CASE];

            // 数据返回类型
            if (isset($config[&#39;result_type&#39;])) {
                $this->fetchType = $config[&#39;result_type&#39;];
            }
            try {
                if (empty($config[&#39;dsn&#39;])) {
                    $config[&#39;dsn&#39;] = $this->parseDsn($config);
                }
                if ($config[&#39;debug&#39;]) {
                    $startTime = microtime(true);
                }
                $this->links[$linkNum] = new PDO($config[&#39;dsn&#39;], $config[&#39;username&#39;], $config[&#39;password&#39;], $params);
                if ($config[&#39;debug&#39;]) {
                    // 记录数据库连接信息
                    Log::record(&#39;[ DB ] CONNECT:[ UseTime:&#39; . number_format(microtime(true) - $startTime, 6) . &#39;s ] &#39; . $config[&#39;dsn&#39;], &#39;sql&#39;);
                }
            } catch (\PDOException $e) {
                if ($autoConnection) {
                    Log::record($e->getMessage(), &#39;error&#39;);
                    return $this->connect($autoConnection, $linkNum);
                } else {
                    throw $e;
                }
            }
        }
        return $this->links[$linkNum];
    }

当数据库链接失败后,可以重新链接或者直接抛出异常;

    /**
     * 析构方法
     * @access public
     */
    public function __destruct()
    {
        // 释放查询
        if ($this->PDOStatement) {
            $this->free();
        }
        // 关闭连接
        $this->close();
    }
当执行sql失败后,调用析构方法,关闭数据库链接;

4. Lorsqu'une erreur survient en php, les ressources sont libérées

php est un script interprétatif. Chaque page php est un programme d'exécution indépendant, quelle que soit la méthode utilisée, tant qu'elle est exécutée (y compris die(), exit(), programme de terminaison d'erreur fatale), le résultat sera Sera fermé une fois renvoyé au serveur. Lorsque le programme est fermé, les ressources seront bien sûr libérées ;

unset(); lorsque plusieurs noms de variables ou noms d'objets pointent vers une adresse de stockage, la fonction unset() est uniquement de détruire le points des noms de variables et des adresses de stockage. Voilà, lorsqu'il n'y a qu'un seul nom de variable ou nom d'objet, unset détruit le contenu à l'adresse de stockage spécifiée

Méthode de destruction : Lorsque l'objet instancié n'a pas d'autres variables ; ou les noms d'objet pointant vers lui, Cette méthode sera exécutée ; ou cette méthode sera exécutée lorsque les ressources de l'objet seront libérées après la fin du script

Recommandations associées :

Le différence de sécurité entre PHP7 et PHP5 (exemple)

Changements apportés par l'arbre de syntaxe abstraite (AST) de PHP7

L'exécution principe du langage PHP7 (analyse du code source PHP7)

PHP 7.4 devrait sortir en décembre 2019

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer