【金沙澳门官网】PHP错误与异常,再谈PHP错误与

作者: 网络编程  发布:2019-11-08

  博客好久没有改良了,实在惭愧,最近在忙人生大事,哈哈!这几天未有看怎么样新的东西,结合项目中相遇的PHP格外管理难点,笔者又再一次梳理了前面模糊的定义,希望对大家领会PHP非常管理有所扶植。

 请必要求专一,未有卓殊表达:本例 PHP Version < 7

  请必要求注意,未有新鲜表明:本例 **PHP Version < 7**
  聊起PHP卓殊管理,大家首先会想到try-catch,那好,大家先看风华正茂段程序吧:有三个test.php文件,有风流倜傥段简单的PHP程序,内容如下,然后命令行施行:php test.php

*  说到PHP分外处理,大家首先会想到try-catch,那好,大家先看生龙活虎段程序吧:有一个test.php文件,有风度翩翩段简单的PHP程序,内容如下,然后命令行施行:php test.php*

1 <?php
2     $num = 0;
3     try {
4         echo 1/$num;
5
6     } catch (Exception $e){
7         echo $e->getMessage();
8     }
9 ?>

金沙澳门官网 1

  作者的标题是:这段程序能正确的捕捉到除0的错误消息吗?
  假若你答应能,那您就把那篇小说看完呢!应该能学点东西。

1 <?php
2     $num = 0;
3     try {
4         echo 1/$num;
5
6     } catch (Exception $e){
7         echo $e->getMessage();
8     }
9 ?>

本小说分5个部分介绍自个儿的老大处理的知晓:

金沙澳门官网 2

风度翩翩、至极与不当的概述

  作者的主题材料是:这段程序能科学的捕捉到除0的错误音讯吗?
  若是您回复能,那你就把那篇作品看完呢!应该能学点东西。

二、ERROR的级别

本文章分5个部分介绍笔者的要命管理的敞亮:

三、PHP极度管理中的黑科学和技术

生龙活虎、极度与谬误的概述

四、玄妙的破获错误和极其

二、ERROR的级别

五、自定义卓殊管理和特别嵌套

三、PHP非常管理中的黑科学和技术

六、PHP7中的非凡管理

四、美妙的捕获错误和丰裕

意气风发、非凡与谬误的概述
  PHP中怎么着是极其:
  程序在运作中现身不符合预期的景况,允许产生(你也不想让他现身不符合规律的意况卡塔 尔(英语:State of Qatar)但他是风流罗曼蒂克种不健康的气象,根据大家的例行逻辑本不应当出的荒唐,但照旧会产出的荒谬,归于逻辑和业务流程的失实,并不是编写翻译恐怕语法上的谬误。

五、自定义至极管理和那贰个嵌套

  PHP中哪些是谬误:
  归于php脚本本身的标题,大部分情景是由错误的语法,服务器境遇招致,使得编写翻译器不只怕透过检查,以致不可能运行的场合。warning、notice都以荒唐,只是她们的等级分歧而已,况且错误是不可能被try-catch捕获的。

六、PHP7中的极度管理

  上边的布道是有前提条件的:
  在PHP中,因为在任何语言中就不可能这么下定论了,也正是说卓殊和谬误的布道在差异的言语有例外的说教。在PHP中别的作者的不当只怕是非平常的代码都会作为错误看待,并不会以十分的款型抛出,可是也可以有意气风发部分景况会作为至极和谬误同一时间抛出(听他们讲是,作者从未找到适当的事例)。约等于说,你想在数据库连接失败的时候自动捕获卓殊是没用的,因为那就不是这个,是大谬不然。不过在java中就不等同了,他会把无数和预期不相符的一言一行当做卓殊来进展捕获。

生龙活虎、非凡与谬误的概述
  PHP中哪些是特别:
  程序在运作中冒出不相符预期的情景,允许发生(你也不想让她现身不正规的情状卡塔尔国但他是大器晚成种不健康的情形,遵照大家的符合规律化逻辑本不应该出的荒谬,但仍然会鬼使神差的错误,归于逻辑和业务流程的荒诞,实际不是编写翻译也许语法上的荒谬。

  PHP分外管理很鸡肋?
  在地方的剖判中大家得以看来,PHP并不能够积极的抛出极度,不过你能够手动抛出卓殊,那就很无奈了,假诺您领悟哪儿会出难点,你增添if else清除不就行了吗,为何还要手动抛出极其,既然能手动抛出就认证那个不是老大,而是意料之中。以本身的领悟,那正是PHP非凡管理鸡肋的地点(不必然对呀卡塔 尔(英语:State of Qatar)。所以PHP的可怜机制不是那么的全面,可是采纳过框架的校友都晓得有其一场所:你在框架中一贯写起来这段php“自动”捕获非常的代码是能够的,那是怎么?看过源码的校友都知情框架中都会提到四个函数:register_shutdown_function,set_error_handler,set_exception_handler前面我会入眼教学着四个黑科技(science and technology),通过那多少个函数大家得以达成PHP假自动捕获相当和不当。

  PHP中怎样是大谬不然:
  归属php脚本本人的主题材料,半数以上气象是由错误的语法,服务器情况以致,使得编写翻译器不能通过检查,以至超级小概运维的景观。warning、notice都以漏洞超级多,只是她们的等第差异而已,并且错误是不能够被try-catch捕获的。

二、ERROR的级别
  独有熟稔错误等第技术对不当捕捉有更加好的认知。 ERAV4RORubicon有不相同的谬误等第,作者事先的生机勃勃篇小说中有写到:
  下边笔者再总括性的交给这几类错误等级:

  上面包车型的士说教是有前提条件的:
  在PHP中,因为在别的语言中就不能够这么下定论了,也正是说非常和不当的布道在分歧的语言有例外的传道。在PHP中任何笔者的失实大概是非寻常的代码都会作为错误看待,并不会以非常的花样抛出,不过也许有一点情形会作为相当和不当同时抛出(据说是,笔者尚未找到相符的事例)。相当于说,你想在数据库连接战败的时候自动捕获非凡是船到江心补漏迟的,因为那就不是极度,是不对。不过在java中就十分的小器晚成致了,他会把数不完和预期区别的作为作为十分来张开捕获。

 1     Fatal Error:致命错误(脚本终止运行)
 2         E_ERROR         // 致命的运行错误,错误无法恢复,暂停执行脚本
 3         E_CORE_ERROR    // PHP启动时初始化过程中的致命错误
 4         E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR
 5         E_USER_ERROR    // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR)
 6 
 7     Parse Error:编译时解析错误,语法错误(脚本终止运行)
 8         E_PARSE  //编译时的语法解析错误
 9 
10     Warning Error:警告错误(仅给出提示信息,脚本不终止运行)
11         E_WARNING         // 运行时警告 (非致命错误)。
12         E_CORE_WARNING    // PHP初始化启动过程中发生的警告 (非致命错误) 。
13         E_COMPILE_WARNING // 编译警告
14         E_USER_WARNING    // 用户产生的警告信息
15 
16     Notice Error:通知错误(仅给出通知信息,脚本不终止运行)
17         E_NOTICE      // 运行时通知。表示脚本遇到可能会表现为错误的情况.
18         E_USER_NOTICE // 用户产生的通知信息。

  PHP卓殊管理很鸡肋?
  在上头的分析中大家得以看见,PHP并不可能积极的抛出非常,可是你能够手动抛出分外,那就很无语了,倘令你通晓哪个地方会出标题,你增多if else灭亡不就能够了吗,为何还要手动抛出卓殊,既然能手动抛出就认证那一个不是老大,而是意料之中。以本人的精晓,那正是PHP至极管理鸡肋之处(不必然对呀卡塔尔。所以PHP的非常机制不是那么的全面,不过接纳过框架的同窗都晓得有其生机勃勃情景:你在框架中平素写起来这段php“自动”捕获相当的代码是能够的,那是为什么?看过源码的同校都知道框架中都会波及多个函数:register_shutdown_function,set_error_handler,set_exception_handler后边小编会入眼教学着多个黑科学技术,通过那多少个函数我们得以兑现PHP假自动捕获相当和不当。

  因此可见有5类是发生ERubiconROEnclave级其他错误,这种不当直接造成PHP程序退出。
  能够定义成:

二、ERROR的级别
  唯有熟稔错误品级能力对错误捕捉有更加好的认知。 E讴歌RDXRO讴歌MDX有不一样的不当等级,小编事先的意气风发篇文章中有写到:
  上边我再总括性的付出这几类错误品级:

1 ERROR = E_ERROR | E_CORE_ERROR |  E_COMPILE_ERROR | E_USER_ERROR | E_PARSE

金沙澳门官网 3

三、PHP分外管理中的黑科技(science and technology)
  前边提到框架中是能够捕获全体的不当和这些的,之所以能落到实处应有是使用了黑科技(science and technology),哈哈!其实亦非如何黑科学技术,主借使八个首要的函数:

 1     Fatal Error:致命错误(脚本终止运行)
 2         E_ERROR         // 致命的运行错误,错误无法恢复,暂停执行脚本
 3         E_CORE_ERROR    // PHP启动时初始化过程中的致命错误
 4         E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR
 5         E_USER_ERROR    // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR)
 6 
 7     Parse Error:编译时解析错误,语法错误(脚本终止运行)
 8         E_PARSE  //编译时的语法解析错误
 9 
10     Warning Error:警告错误(仅给出提示信息,脚本不终止运行)
11         E_WARNING         // 运行时警告 (非致命错误)。
12         E_CORE_WARNING    // PHP初始化启动过程中发生的警告 (非致命错误) 。
13         E_COMPILE_WARNING // 编译警告
14         E_USER_WARNING    // 用户产生的警告信息
15 
16     Notice Error:通知错误(仅给出通知信息,脚本不终止运行)
17         E_NOTICE      // 运行时通知。表示脚本遇到可能会表现为错误的情况.
18         E_USER_NOTICE // 用户产生的通知信息。

  1:set_error_handler()
  见到这些名字猜度就领会怎么样意思了,那么些函数用于捕获错误,设置多少个顾客自定义的错误管理函数。

金沙澳门官网 4

1 <?php
2     set_error_handler('zyferror');
3     function zyferror($type, $message, $file, $line)
4     {
5       var_dump('<b>set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .</b><br />');
6     }
7 ?>

  因而可以预知有5类是发出E帕杰罗RO宝马X5级其余大谬不然,这种错误直接促成PHP程序退出。
  能够定义成:

  当程序现身谬误的时候自动调用此方法,不过须求留意一下两点:第黄金时代,如若存在该方式,相应的error_reporting()就不能够在接收了。全部的荒谬都会付出自定义的函数管理。第二,此方式不可能管理以下级其余失实:E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,set_error_handler() 函数所在文件中生出的E_ST途胜ICT,该函数只好捕获系统一发布出的朝气蓬勃部分Warning、Notice等第的错误。
  何况他有五种调用的秘技:

1 ERROR = E_ERROR | E_CORE_ERROR |  E_COMPILE_ERROR | E_USER_ERROR | E_PARSE
1 <?php
2      // 直接传函数名 NonClassFunction
3      set_error_handler('function_name'); 
4 
5      // 传 class_name && function_name
6      set_error_handler(array('class_name', 'function_name')); 
7 ?>

三、PHP相当管理中的黑科技(science and technology)
  前边提到框架中是能够捕获全体的荒诞和那三个的,之所以能促成应有是应用了黑科学技术,哈哈!其实亦非哪些黑科学技术,首若是两个基本点的函数:

   2:register_shutdown_function()
  捕获PHP的失实:Fatal Error、Parse Error等,那个点子是PHP脚本实行完结前最终一个调用的函数,比如脚本错误、die()、exit、极度、符合规律甘休都会调用,多么牛逼的叁个函数啊!通过这几个函数就能够在剧本甘休前判别此次实施是或不是有不当发生,这时候就要依赖三个函数:error_get_last();那几个函数能够得到此番实践发生的装有错误。error_get_last();重返的信息:
  [type]           - 错误类型
  [message] - 错误音讯
  [file]              - 产生错误所在的文本
  [line]             - 产生错误所在的行

  1:set_error_handler()
  看见这些名字测度就理解怎么意思了,这一个函数用于捕获错误,设置一个客商自定义的错误处理函数。

1 <?php
2     register_shutdown_function('zyfshutdownfunc');
3     function zyfshutdownfunc()
4     {
5         if ($error = error_get_last()) {
6             var_dump('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>');
7         }
8     }
9 ?>

金沙澳门官网 5

   通过这种措施就能够神奇的打字与印刷出程序截止前全体的错误新闻。不过本身在测量试验的时候自个儿开采实际不是有所的谬误终止后都会调用那几个函数,能够看下边包车型地铁贰个测量试验文件,内容是:

1 <?php
2     set_error_handler('zyferror');
3     function zyferror($type, $message, $file, $line)
4     {
5       var_dump('<b>set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .</b><br />');
6     }
7 ?>
 1 <?php
 2     register_shutdown_function('zyfshutdownfunc');
 3     function zyfshutdownfunc()
 4     {
 5         if ($error = error_get_last()) {
 6             var_dump('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>');
 7         }
 8     }
 9     var_dump(23 - ); //此处语法错误
10 ?>

金沙澳门官网 6

   自个儿能够试一下,你可以看见一直就不会触发zyfshutdownfunc()函数,其实那是二个语法错误,直接报了二个:

  当程序现身谬误的时候自动调用此方法,但是要求留意一下两点:第少年老成,尽管存在该情势,相应的error_reporting()就无法在使用了。全部的错误都会交到自定义的函数管理。第二,此方法不能够管理以下级其他谬误:E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,set_error_handler() 函数所在文书中生出的E_ST揽胜极光ICT,该函数只可以捕获系统一发布出的有的Warning、Notice级其余谬误。
  並且她有各个调用的秘诀:

1 <?php
2     Parse error: syntax error, unexpected ')' in /www/mytest/exception/try-catch.php on line 71
3 ?>

金沙澳门官网 7

  由此引出四个奇葩的主题素材:问怎么着无法接触,为何框架中是可以的?其实原因很简短,只在parse-time出错开上下班时间是不会调用本函数的。独有在run-time出错的时候,才会调用本函数,作者的领会是语法检查器前未有实施register_shutdown_function()去把需求登记的函数放到调用的商旅中,所以就向来不会运作。那框架中缘何其余不当都能走入到register_shutdown_function()中呢,其实在框架中貌似会有统黄金时代的入口index.php,然后每一种类库文件都会经过include ** 的秘诀加载到index.php中,极度与富有的顺序都会在index.php中汇集,相同,你写的具有语法错误的文书也会被引进到进口文件中,那样的话,调用框架,施行index.php,index.php自己并从未语法错误,也就不会产生parse-time错误,而是 include 文件出错了,是run-time的时候出错了,所以框架执行完之后就能够触发register_shutdown_function();
  所以今后只是试一下这几个写法,那样就能触发zyfshutdownfunc()回调了:

1 <?php
2      // 直接传函数名 NonClassFunction
3      set_error_handler('function_name'); 
4 
5      // 传 class_name && function_name
6      set_error_handler(array('class_name', 'function_name')); 
7 ?>
 1 a.php文件
 2 <?php
 3   // 模拟语法错误
 4   var_dump(23 - );
 5 ?>
 6 
 7 b.php文件
 8 <?php
 9     register_shutdown_function('zyfshutdownfunc');
10     function zyfshutdownfunc()
11     {
12         if ($error = error_get_last()) {
13             var_dump('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>');
14         }
15     }
16     require 'a.php';
17 ?>

金沙澳门官网 8

   3:set_exception_handler()
  设置暗中同意的充裕管理程序,用在平素不用try/catch块来捕获的那么些,也正是说不管你抛出的要命有未有人捕获,若无人捕获就能够跻身到该方法中,並且在回调函数调用后极度会中止。看一下用法:

   2:register_shutdown_function()
  捕获PHP的错误:Fatal Error、Parse Error等,那一个方法是PHP脚本推行完结前最终叁个调用的函数,比方脚本错误、die()、exit、十分、寻常停止都会调用,多么牛逼的三个函数啊!通过这几个函数就可以在本子停止前剖断这一次实施是不是有荒谬爆发,这时候将要依附三个函数:error_get_last();那些函数能够获得此番推行爆发的全体错误。error_get_last();重回的新闻:
  [type]           - 错误类型
  [message] - 错误音信
  [file]              - 产生错误所在的文书
  [line]             - 发生错误所在的行

1 <?php
2     set_exception_handler('zyfexception');
3     function zyfexception($exception)
4     {
5         var_dump("<b>set_exception_handler: Exception: " . $exception->getMessage()  . '</b>');
6     }
7     throw new Exception("zyf exception");
8 ?>

金沙澳门官网 9

 四、奇妙的破获错误和足够
  1:把错误以极其的款式抛出(无法完全抛出)
    由地点的讲授大家知晓,php中的错误是不能够以特其余像是捕获的,可是大家须求让他俩抛出,已落得扩张try-catch的熏陶范围,大家面前讲到过set_error_handler() 方法,他是干嘛用的,他是捕获错误的,所以大家就可以靠任他来吧错误捕获,然后再以分外的款式抛出,ok,试试下边包车型地铁写法:

1 <?php
2     register_shutdown_function('zyfshutdownfunc');
3     function zyfshutdownfunc()
4     {
5         if ($error = error_get_last()) {
6             var_dump('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>');
7         }
8     }
9 ?>
 1 <?php
 2     set_error_handler('zyferror');
 3     function zyferror($type, $message, $file, $line)
 4     {
 5         throw new Exception($message . 'zyf错误当做异常');
 6     }
 7 
 8     $num = 0;
 9     try {
10         echo 1/$num;
11 
12     } catch (Exception $e){
13         echo $e->getMessage();
14     }
15 ?>

金沙澳门官网 10

  好了,试一下,会打字与印刷出:

   通过这种艺术就足以美妙的打字与印刷出程序停止前全体的错误新闻。但是自己在测验的时候自个儿意识并非享有的谬误终止后都会调用那个函数,能够看上面包车型大巴叁个测验文件,内容是:

1 Division by zero zyf123

金沙澳门官网 11

  流程:本来是除0错误,然后触发set_error_handler(),在set_error_handler()中一定与杀了个回马枪,再把错误消息以这一个的款式抛出来,那样就足以兑现错误以特别的情势抛出。大家要小心:那样做是有劣点的,会遭到set_error_handler()函数捕获等级的限量。

 1 <?php
 2     register_shutdown_function('zyfshutdownfunc');
 3     function zyfshutdownfunc()
 4     {
 5         if ($error = error_get_last()) {
 6             var_dump('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>');
 7         }
 8     }
 9     var_dump(23 - ); //此处语法错误
10 ?>

     2:捕获全数的大谬不然
        由set_error_handler()可见,他能够捕获生龙活虎有个别错误,不可能捕获系统级E_ERROR、E_PAKoleosSE等错误,然则那有些能够由register_shutdown_function()捕获。所以两者结合能现身很好的意义。
        看下边包车型大巴次序:

金沙澳门官网 12

 1 a.php内容:
 2 <?
 3     // 模拟Fatal error错误
 4     //test();
 5 
 6     // 模拟用户产生ERROR错误
 7     //trigger_error('zyf-error', E_USER_ERROR);
 8 
 9     // 模拟语法错误
10     var_dump(23 - );
11 
12     // 模拟Notice错误
13     //echo $f;
14 
15     // 模拟Warning错误
16     //echo '123';
17     //ob_flush();
18     //flush();
19     //header("Content-type:text/html;charset=gb2312");
20 ?>

21 b.php内容:
22 <?
23     error_reporting(0);
24     register_shutdown_function('zyfshutdownfunc');
25     function zyfshutdownfunc()
26     {
27         if ($error = error_get_last()) {
28             var_dump('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>');
29         }
30     }
31 
32     set_error_handler('zyferror');
33     function zyferror($type, $message, $file, $line)
34     {
35         var_dump('<b>set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .</b><br />');
36     }
37 
38     require 'a.php';
39 ?>

   自身能够试一下,你能够看来从来就不会触发zyfshutdownfunc()函数,其实这是三个语法错误,直接报了三个:

本文由金沙澳门官网发布于网络编程,转载请注明出处:【金沙澳门官网】PHP错误与异常,再谈PHP错误与

关键词: 金沙澳门官网

上一篇:世界上最好用的编程语言
下一篇:没有了