PHP错误和异常处理
⽬录:
⼀、前⾔
⼆、错误级别
三、⾃定义PHP中的错误处理⽅法
四、⾃定义异常处理
⼀、前⾔:
PHP中的错误是什么:
由于php脚本⾃⾝的问题,⼤部分情况是由错误的语法,服务器环境导致,使得编译器⽆法通过检查,甚⾄⽆法运⾏的情况。像warning、notice、fatal 都是错误,只是他们的级别不同⽽已,并且错误是不能被try-catch捕获的。
在写PHP程序时,我们基本上使⽤的是PHP语⾔中系统⾃定义的报错⽅式,例如
例1:在PHP安装⽬录中查并打开配置⽂件php.ini,设置display_errors的值
删除前⾯的分号,并设置值为on
例2:在PHP代码中设置
ini_set('error_reporting', E_ALL );
ini_set('display_errors', 'on' );
附上error_reporting所有参数定义
参数说明
error_reporting(0)关闭错误报告
error_reporting(E_ERROR | E_WARNING | E_PARSE)报告 runtime 错误
error_reporting(E_ALL)报告所有错误
ini_set("error_reporting", E_ALL)等同 error_reporting(E_ALL)
error_reporting(E_ALL & ~E_NOTICE)报告 E_NOTICE 之外的所有错误
⼆、错误级别
级别具体值
Fatal Error
致命错误(脚本终⽌运⾏)E_ERROR // 致命的运⾏错误,错误⽆法恢复,暂停执⾏脚本
E_CORE_ERROR // PHP启动时初始化过程中的致命错误
E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎⽣成了⼀个E_ERROR
E_USER_ERROR // ⾃定义错误消息。像⽤PHP函数trigger_error(错误类型设置为:E_USER_ERROR)
Parse Error
编译时解析错误,语法错误(脚本终⽌运⾏)
E_PARSE //编译时的语法解析错误
Warning Error
当前页面脚本发生错误警告错误(仅给出提⽰信息,脚本不终⽌运⾏)E_WARNING // 运⾏时警告 (⾮致命错误)。
E_CORE_WARNING // PHP初始化启动过程中发⽣的警告 (⾮致命错误) 。E_COMPILE_WARNING // 编译警告
E_USER_WARNING // ⽤户产⽣的警告信息
Notice Error
通知错误(仅给出通知信息,脚本不终⽌运⾏)E_NOTICE // 运⾏时通知。表⽰脚本遇到可能会表现为错误的情况. E_USER_NOTICE // ⽤户产⽣的通知信息。
具体值中对应的数字ID
ID级别描述
1E_ERROR运⾏时致命的错误。不能修复的错误。停⽌执⾏脚本。
2E_WARNING运⾏时⾮致命的错误。没有停⽌执⾏脚本。
4E_PARSE编译时的解析错误。解析错误应该只由解析器⽣成。
8E_NOTICE运⾏时的通知。脚本发现可能是⼀个错误,但也可能在正常运⾏脚本时发⽣。
16E_CORE_ERROR PHP 启动时的致命错误。这就如同 PHP 核⼼的 E_ERROR。
32E_CORE_WARNING PHP 启动时的⾮致命错误。这就如同 PHP 核⼼的 E_WARNING。
64E_COMPILE_ERROR编译时致命的错误。这就如同由 Zend 脚本引擎⽣成的 E_ERROR。
128E_COMPILE_WARNING编译时⾮致命的错误。这就如同由 Zend 脚本引擎⽣成的 E_WARNING。
256E_USER_ERROR⽤户⽣成的致命错误。这就如同由程序员使⽤ PHP 函数 trigger_error() ⽣成的 E_ERROR。
512E_USER_WARNING⽤户⽣成的⾮致命错误。这就如同由程序员使⽤ PHP 函数 trigger_error() ⽣成的 E_WARNING。
1024E_USER_NOTICE⽤户⽣成的通知。这就如同由程序员使⽤ PHP 函数 trigger_error() ⽣成的 E_NOTICE。
2048E_STRICT运⾏时的通知。PHP 建议您改变代码,以提⾼代码的互⽤性和兼容性。
4096E_RECOVERABLE_ERROR可捕获的致命错误。这就如同⼀个可以由⽤户定义的句柄捕获的 E_ERROR(见 set_error_handler())。
6143E_ALL所有的错误和警告的级别,除了 E_STRICT(⾃ PHP 6.0 起,E_STRICT 将作为 E_ALL的⼀部分)。ID级别描述
三、⾃定义PHP中的错误处理⽅法
1:set_error_handler()
set_error_handler(errorhandler,E_ALL|E_STRICT);
参数描述
errorhandler必需。规定⽤户错误处理函数的名称。
E_ALL|E_STRICT可选。规定显⽰何种错误报告级别的⽤户定义错误。默认是 "E_ALL"。
PHP⼿册中errorhandler 的描述:
看代码:
输出:
按照系统报错的格式改造⼀下:
输出:
说明:
调⽤ set_error_handler() 时需要注意是,
第⼀,如果存在该⽅法,相应的error_reporting()就不能在使⽤了,所有的错误都会交给⾃定义的函数处理。
第⼆,该函数只能捕获系统产⽣的⼀些Warning、Notice级别的错误。
2:register_shutdown_function()
说明:
register_shutdown_function可以捕获Fatal Error、Parse Error等,这个⽅法是PHP脚本执⾏结束前最后⼀个调⽤的函数,⽐如脚本错误、die()、exit、异常、正常结束都会调⽤。
通过这个函数就可以在脚本结束前判断这次执⾏是否有错误产⽣,这时就要借助于⼀个函数:error_get_last();这个函数可以拿到本次执⾏产⽣的错误。
看代码:
输出:
改造⼀下:
输出:
四、⾃定义异常处理
什么是异常:
程序在运⾏中出现不符合预期的情况或与正常流程不同的情况。⼀种不正常的情况,按照正常逻辑不该出现,但在写代码时仍然会出现的想不到情况,这是属于逻辑和业务流程的错误,
⽽不是编译或者语法上的错误。
引⼊Exception异常处理类:
说明:异常处理的加⼊使得在 PHP 程序中排查错误、捕获异常更加简单容易,也使得 PHP 程序在健壮性⽅⾯有很⼤改善和提⾼。异常处理在 PHP 中的具体体现就是,PHP 提供了⼀
个名叫 Exception 的类完成对 PHP 程序异常的处理,这个类包含了⼀些处理异常的函数,这些函数可以捕获程序异常和错误。
PHP异常处理(Exception)
例1:使⽤ try catch 捕获程序中的异常
说明:
⽰例代码中,在 try 语句块中试着判断当前⽬录下是否存在名为 test 的⽬录,如果不存在这个⽬录,那么就会执⾏else的代码,通过关键字 throw 抛出异常。
这个异常是⼀个 Exception 类的对象,通过 new 关键字⽣成,并且⽤⾃定义的错误信息 $msg和错误代码 $code 初始化该对象,⽤于后⾯ catch 异常时获取这些信息。
⼀旦抛出异常,那么 try 语句块中剩下的代码就不再继续执⾏,程序流程转⾄相应的 catch 语句块执⾏,最终通过 Exception 对象调⽤其成员函数输出错误信息和代码。
发布评论