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

广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买

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

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

1.php异常和错误

在其他语言中,异常和错误是有区别的,但是PHP,遇见自身错误时,会触发一个错误,而不是跑出异常。并且,php大部分情况,都会触发错误,终止程序执行,在php5中,try catch是没有办法处理错误的。

php7是可以捕获错误的;

1.1 php5 错误异常

PHP
// 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的异常处理

PHP
// 处理致命错误:脚本结束后执行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();没有捕获到异常
登录后复制
PHP
// 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中,如果既想捕获异常有需要捕获错误

PHP
try{    fun();}catch ( Throwable $e){    echo $e->getCode().'<br/>';    echo $e->getMessage().'<br/>';    echo $e->getLine().'<br/>';    echo $e->getFile().'<br/>';}
登录后复制

3. thinkphp5框架的错误处理:

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

链接数据库后,处理异常的是:

PHP
/**     * 连接数据库方法     * @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 异常处理的分析)的详细内容,更多请关注9543建站博客其它相关文章!

广告:SSL证书一年128.66元起,点击购买~~~

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。
作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:jquery 三秒后遮罩消失
下一篇:laravel怎么修改数据库的表名

发表评论

关闭广告
关闭广告