您好,登錄后才能下訂單哦!
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銷毀的是指定的存儲地址上的內容;
析構方法:當實例化的對象,沒有其他變量或對象名指向時,就會執行此方法;或者是在腳本結束后,釋放對象資源時,執行此方法;
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。