Heim  >  Artikel  >  Backend-Entwicklung  >  Ausnahmebehandlungsmechanismus von PHP5 und PHP7 (Analyse der Thinkphp5-Ausnahmebehandlung)

Ausnahmebehandlungsmechanismus von PHP5 und PHP7 (Analyse der Thinkphp5-Ausnahmebehandlung)

藏色散人
藏色散人nach vorne
2019-03-28 13:31:303802Durchsuche

In diesem Artikel wird hauptsächlich der Ausnahmebehandlungsmechanismus von PHP5 und PHP7 vorgestellt (Analyse der Thinkphp5-Ausnahmebehandlung).

1.php-Ausnahmen und Fehler

In anderen Sprachen sind Ausnahmen und Fehler anders, aber PHP löst einen Fehler aus, wenn es auf seinen eigenen Fehler stößt, anstatt ihn auszulösen eine Ausnahme. Darüber hinaus löst PHP in den meisten Fällen einen Fehler aus und bricht die Programmausführung ab. In PHP5 gibt es keine Möglichkeit, Fehler zu behandeln.

php7 kann Fehler abfangen;

1.1 PHP5-Fehlerausnahme

// 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 php7-Ausnahmebehandlung

// 处理致命错误:脚本结束后执行
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();

Zusammenfassung: Throwable ist die Basisklasse von Error und Exception. Wenn Sie in PHP7 Ausnahmen abfangen möchten, müssen Sie Fehler abfangen

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

3. Fehlerbehandlung des thinkphp5-Frameworks:

 在异常错误处理类: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']);
    }
当程序出现错误时,会执行这些异常、错误的函数;

Nach der Verbindung zur Datenbank wird die Ausnahme wie folgt behandelt:

/**
     * 连接数据库方法
     * @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. Wenn ein Fehler in PHP auftritt, wird die Ressource freigegeben

php ist ein interpretierendes Skript. Unabhängig von der verwendeten Methode wird das Ergebnis zurückgegeben (einschließlich die(), exit(), Programm zur Beendigung eines schwerwiegenden Fehlers). an den Server gesendet und dieser wird geschlossen. Wenn das Programm geschlossen wird, werden die Ressourcen natürlich freigegeben.

unset(); wenn mehrere Variablennamen oder Objektnamen auf eine Speicheradresse verweisen, besteht die Funktion der unset()-Funktion nur darin, diese zu zerstören Punkte der Variablennamen und Speicheradressen. Wenn es nur einen Variablennamen oder Objektnamen gibt, wird der Inhalt an der angegebenen Speicheradresse zerstört.

Zerstörungsmethode: Wenn das instanziierte Objekt keine anderen Variablen hat oder Objektnamen, die darauf verweisen. Diese Methode wird ausgeführt, wenn die Objektressourcen nach Ende des Skripts freigegeben werden.

Verwandte Empfehlungen:

Die Sicherheitsunterschied zwischen PHP7 und PHP5 (Beispiel)

Änderungen durch PHP7s Abstract Syntax Tree (AST)

Die Ausführung Prinzip der PHP7-Sprache (PHP7-Quellcode-Analyse)

PHP 7.4 wird voraussichtlich im Dezember 2019 veröffentlicht

Das obige ist der detaillierte Inhalt vonAusnahmebehandlungsmechanismus von PHP5 und PHP7 (Analyse der Thinkphp5-Ausnahmebehandlung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen