谬误
谬误是写顺序中不成防止的,若何去发现定位谬误及矫正更是一门学识。明天以及各人聊聊php7之后的谬误与异样。
谬误的分类
普通谬误分为语法谬误、运转时谬误、逻辑谬误。语法和运转时谬误很容易去排查,但逻辑谬误就没有是那末简略的了。不才正在判别的时分也有屡次将比拟运算==写成为了赋值运算=,像我这类就很难去发现。普通跟着经历的丰厚(踩坑踩多了),会愈来愈容易来找到逻辑谬误。
管制谬误的输入
普通倡议开发阶段开启谬误输入不便实时发现谬误,上线阶段为了平安性及雅观倡议封闭谬误输入。
php提供了一个参数display_errors用于管制谬误向阅读器、cli的输入。有两种形式能够来修正它,经过修正php.ini文件或应用ini_set函数来设置。上面展现应用ini_set来设置屏蔽谬误输入的代码。
<?php ini_set('display_errors', 0); echo $a; echo 0; date(); echo 1;
该顺序会失常输入01,但没有会输入谬误信息。
谬误陈诉级别
普通分为4年夜类
parse语法谬误
error致命谬误
warning正告级别谬误
notice留意级别谬误
正在php.ini设置装备摆设文件中,有选项error_reporting,该选项用来管制输入何种级此外谬误。常见的有E_ALL、E_WARNING、E_NOTICE。
能够经过函数error_reporting()来静态管制谬误级此外输入。
# 输入一切级别谬误 error_reporting(E_ALL); # 输入一切级别除了了E_NOTICE error_reporting(E_ALL & ~E_NOTICE); # 输入一切级别除了了E_NOTICE以及E_WARNING error_reporting(E_ALL & ~(E_NOTICE | E_WARNING));
display_errors与error_reporting的区分
display_errors是用来管制谬误能否输入,而error_reporting是用来管制输入何种级此外谬误。通常他们会搭配应用
ini_set('display_errors', 0); // 封闭谬误输入 error_reporting(E_ALL); // 输入一切级此外谬误信息
下面的设置装备摆设普通是上线阶段,屏蔽一切的谬误输入,然而记载谬误到php的谬误日记里。谬误日记的门路是由选项error_log 决议的。
假如设置error_reporting为0值,则没有输入谬误也没有记载谬误日记。
谬误关于顺序的影响
当顺序有语法谬误时,顺序是没有会执行的。当有error级此外谬误时,顺序就会中止向下执行。notice、及warning级别谬误时没有会影响顺序的向下执行的。
error_reporting(E_ALL); // 输入一切级此外谬误信息 echo $a; echo 0; date(); echo 1; new a; echo 2;
该顺序会输入0以及1,但没有会输入2。
用户自界说谬误
trigger_error()函数能够消费一个用户级此外谬误。谬误级别有E_USER_ERROR 、E_USER_WARNING、E_USER_NOTICE 等
<?php trigger_error('这是notice级别谬误', E_USER_NOTICE); trigger_error('warning谬误', E_USER_WARNING); trigger_error('deprecated', E_USER_DEPRECATED); trigger_error('error谬误', E_USER_ERROR);
自界说谬误解决
set_error_handler — 设置用户自界说的谬误解决函数,该函数原型以下:
set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
该函数首个参数是一个回调函数,原型以下:
handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
error 谬误级别
errstr 谬误信息
errfile 发送谬误的文件
errline 谬误呈现的行号
如下级此外谬误不克不及由用户界说的函数来解决: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,以及正在挪用 set_error_handler() 函数所正在文件中孕育发生的年夜少数 E_STRICT。
<?php define('DEBUG', false); set_error_handler('error_handler'); if (DEBUG) { ini_set('display_errors', 'On'); } else { ini_set('display_errors', 'Off'); } function error_handler($errLevel, $errInfo, $errFile, $errLine) { echo "ErrorLevel:$errLevel: $errInfo In $errFile ON $errLine" . PHP_EOL; } echo $a;
异样
异样以及谬误时有区分的,谬误普通是指咱们能管制的成绩,比方变量名写错了,或许判别前提写的没有错,招致死轮回。而异样通常指那些难以管制的、预料外的谬误,比方mysql衔接没有上,文件句柄关上失败等状况。
php的异样也是经典的try catch finally,但以及普通的异样解决纷歧样的是,绝年夜局部的异样需求自行抛出。抛出异样应用throw要害字实现。php也支持捕捉多个异样。
<?php class MyError extends Exception { public function printErr () { echo '犯错啦'.PHP_EOL; } } class YourError extends Exception { public function printErr () { echo 'errors'.PHP_EOL; } } try { if (mt_rand(0,1)) { throw new MyError('谬误'); } else { throw new YourError('谬误'); } } catch (MyError $e) { $e->printErr(); } catch (YourError $e) { $e->printErr(); } finally { echo '不论有无异样,我城市被执行'.PHP_EOL; }
php的异样假如不捕捉,则会报Fatal Error谬误,顺序没有会持续向下执行。
PHP 7 谬误解决
PHP 7 扭转了年夜少数谬误的陈诉形式。没有同于传统(PHP 5)的谬误陈诉机制,如今年夜少数谬误被作为 Error 异样抛出。 Error 以及 Exception 都完成了 Throwable 接口
异样解决
设置默许的异样解决顺序,有try/catch捕捉的话这个异样函数就没有会执行,反之就会执行异样解决函数,并且执行的话,剧本将没有会持续执行。
php应用set_exception_handler来设置用户自界说的异样解决函数 ,函数原型以下:
set_exception_handler ( callable $exception_handler ) : callable
回调函数的原型以下:
handler ( Throwable $ex ) : void
上面,咱们来写一个异样解决函数
<?php class MyError extends Exception { public function printErr () { echo '犯错啦'.PHP_EOL; } } class YourError extends Exception { public function printErr () { echo 'errors'.PHP_EOL; } } try { if (mt_rand(0,1)) { throw new MyError('谬误'); } else { throw new YourError('谬误'); } } catch (MyError $e) { $e->printErr(); } catch (YourError $e) { $e->printErr(); } finally { echo '不论有无异样,我城市被执行'.PHP_EOL; }
对立解决谬误与异样
学完了谬误与异样,晓得若何去应用自界说谬误解决以及异样解决,如今咱们就能够对立解决谬误与异样了。
<?php class Errors { // 解决非致命谬误 static function errorHandle($errLevel, $errInfo, $errFile, $errLine) { echo '谬误:'.PHP_EOL; print_r(['file' => $errFile, 'level' => $errLevel, 'line' => $errLine, 'info' => $errInfo]); } // 解决致命谬误及异样 static function exceptionHandle(Throwable $ex) { echo '异样:'.PHP_EOL; print_r(['file' => $ex->getFile(), 'level' => $ex->getCode(), 'line' => $ex->getLine(), 'info' => $ex->getMessage()]); } } set_error_handler(['Errors', 'errorHandle']); set_exception_handler(['Errors', 'exceptionHandle']);
以上就是php7的谬误与异样解决的具体内容,更多请存眷资源魔其它相干文章!
标签: PHP7 php7开发教程 php7开发资料 php7开发自学
抱歉,评论功能暂时关闭!