亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php5和php7的異常處理機制有區別嗎

發布時間:2020-07-03 09:10:44 來源:億速云 閱讀:148 作者:Leah 欄目:編程語言

php5和php7的異常處理機制有區別嗎?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

1.php異常和錯誤

在其他語言中,異常和錯誤是有區別的,但是PHP,遇見自身錯誤時,會觸發一個錯誤,而不是跑出異常。并且,php大部分情況,都會觸發錯誤,終止程序執行,在php5中,try catch是沒有辦法處理錯誤的。

php7是可以捕獲錯誤的;

1.1 php5 錯誤異常

// 1.異常處理
try{
  throw new Exception("Error Processing Request", 1);
}catch ( Exception $e){
  echo $e->getCode().'<br/>';
  echo $e->getMessage().'<br/>';
  echo $e->getLine().'<br/>';
  echo $e->getFile().'<br/>';
}

返回:

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

// 2.結果php錯誤處理機制
function MyErrorHandler($error,$errstr,$errfile,$errline){
echo '<b> Custom error:</b>'.$error.':'.$errstr.'<br/>';
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().'<br/>';
  echo $e->getMessage().'<br/>';
  echo $e->getLine().'<br/>';
  echo $e->getFile().'<br/>';
}

結果:
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 '<pre/>';
  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().'<br/>';
  echo $e->getMessage().'<br/>';
  echo $e->getLine().'<br/>';
  echo $e->getFile().'<br/>';
}

結果:

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的異常處理

// 處理致命錯誤:腳本結束后執行
function shutdown_function(){
    $e = error_get_last();
    echo '<pre>';
    var_dump($e);
}
register_shutdown_function('shutdown_function');
// 結果php錯誤處理機制
function MyErrorHandler($error,$errstr,$errfile,$errline){
    echo '<b> Custom error:</b>'.$error.':'.$errstr.'<br/>';
    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().'<br/>';
    echo $e->getMessage().'<br/>';
    echo $e->getLine().'<br/>';
    echo $e->getFile().'<br/>';
}
結果:
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 'catch Error:'.$e->getCode().':'.$e->getMessage().'<br/>';


}

set_exception_handler('exception_handler');

fun();

總結: Throwable 是Error 和 Exception 的基類,在php7中,如果既想捕獲異常有需要捕獲錯誤

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

3. thinkphp5框架的錯誤處理:

 在異常錯誤處理類: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']);
    }
當程序出現錯誤時,會執行這些異常、錯誤的函數;

鏈接數據庫后,處理異常的是:

/**
     * 連接數據庫方法
     * @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['params']) && is_array($config['params'])) {
                $params = $config['params'] + $this->params;
            } else {
                $params = $this->params;
            }
            // 記錄當前字段屬性大小寫設置
            $this->attrCase = $params[PDO::ATTR_CASE];

            // 數據返回類型
            if (isset($config['result_type'])) {
                $this->fetchType = $config['result_type'];
            }
            try {
                if (empty($config['dsn'])) {
                    $config['dsn'] = $this->parseDsn($config);
                }
                if ($config['debug']) {
                    $startTime = microtime(true);
                }
                $this->links[$linkNum] = new PDO($config['dsn'], $config['username'], $config['password'], $params);
                if ($config['debug']) {
                    // 記錄數據庫連接信息
                    Log::record('[ DB ] CONNECT:[ UseTime:' . number_format(microtime(true) - $startTime, 6) . 's ] ' . $config['dsn'], 'sql');
                }
            } catch (\PDOException $e) {
                if ($autoConnection) {
                    Log::record($e->getMessage(), 'error');
                    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. php發生錯誤時,資源釋放

php是解釋性腳本,每個php頁面都是一個獨立的執行程序,不管用什么方式只要執行完了(包括die(),exit(),致命錯誤終止程序),都會把結果返回給服務器,都會關閉。程序都關閉了,資源當然會被釋放;

unset();當多個變量名或者對象名指向一塊存儲地址時,unset()函數的作用僅僅是銷毀變量名和存儲地址的指向而已,當僅有一個變量名或者對象名,unset銷毀的是指定的存儲地址上的內容;

析構方法:當實例化的對象,沒有其他變量或對象名指向時,就會執行此方法;或者是在腳本結束后,釋放對象資源時,執行此方法;

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会理县| 金门县| 江达县| 汉沽区| 青州市| 九江市| 南投市| 象州县| 蒙城县| 甘谷县| 乐昌市| 城市| 麻城市| 天祝| 巴彦淖尔市| 阿拉善左旗| 东光县| 武宁县| 宁都县| 安阳县| 花垣县| 巴楚县| 南京市| 衡阳市| 岳池县| 隆安县| 忻城县| 安义县| 涡阳县| 金平| 冕宁县| 昌宁县| 县级市| 甘孜县| 来宾市| 顺昌县| 高邑县| 蒲城县| 阳信县| 诏安县| 酉阳|