php5和php7的异常处理机制(thinkphp5 异常处理的分析)

互联网 19-3-28
本篇文章主要给大家介绍php5和php7的异常处理机制(thinkphp5 异常处理的分析),希望对需要的朋友有所帮助!

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销毁的是指定的存储地址上的内容;

析构方法:当实例化的对象,没有其他变量或对象名指向时,就会执行此方法;或者是在脚本结束后,释放对象资源时,执行此方法;

相关推荐:

《PHP7和PHP5在安全上的区别(实例)》

《PHP7 的抽象语法树(AST)带来的变化》

《PHP7语言的执行原理(PHP7源码分析)》

《PHP 7.4预计将在2019年12月发布》

以上就是php5和php7的异常处理机制(thinkphp5 异常处理的分析)的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:深入理解PHP7内核之zval

相关资讯