php5和php7的异常处理机制有区别吗
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/>';}返回:1Error Processing Request158E:\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_msgError 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 172array(4) { ["type"]=> int(1) ["message"]=> string(131) "Uncaught Error: Call to undefined function fun() in E:\phpwebenv\PHPTutorial\WWW\test\index.php:172Stack 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/>';}结果:0Call to undefined function fun()172E:\phpwebenv\PHPTutorial\WWW\test\index.phpNULL 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销毁的是指定的存储地址上的内容;
析构方法:当实例化的对象,没有其他变量或对象名指向时,就会执行此方法;或者是在脚本结束后,释放对象资源时,执行此方法;
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。