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 |
级别 |
描述 |
---|---|---|
1 | E_ERROR | 运行时致命的错误。不能修复的错误。停止执行脚本。 |
2 | E_WARNING | 运行时非致命的错误。没有停止执行脚本。 |
4 | E_PARSE | 编译时的解析错误。解析错误应该只由解析器生成。 |
8 | E_NOTICE | 运行时的通知。脚本发现可能是一个错误,但也可能在正常运行脚本时发生。 |
16 | E_CORE_ERROR | PHP 启动时的致命错误。这就如同 PHP 核心的 E_ERROR。 |
32 | E_CORE_WARNING | PHP 启动时的非致命错误。这就如同 PHP 核心的 E_WARNING。 |
64 | E_COMPILE_ERROR | 编译时致命的错误。这就如同由 Zend 脚本引擎生成的 E_ERROR。 |
128 | E_COMPILE_WARNING | 编译时非致命的错误。这就如同由 Zend 脚本引擎生成的 E_WARNING。 |
256 | E_USER_ERROR | 用户生成的致命错误。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_ERROR。 |
512 | E_USER_WARNING | 用户生成的非致命错误。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_NOTICE。 |
2048 | E_STRICT | 运行时的通知。PHP 建议您改变代码,以提高代码的互用性和兼容性。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。这就如同一个可以由用户定义的句柄捕获的 E_ERROR(见 set_error_handler())。 |
6143 | E_ALL | 所有的错误和警告的级别,除了 E_STRICT(自 PHP 6.0 起,E_STRICT 将作为 E_ALL的一部分)。 |
set_error_handler(errorhandler,E_ALL|E_STRICT);
参数 |
描述 |
---|---|
errorhandler | 必需。规定用户错误处理函数的名称。 |
E_ALL|E_STRICT | 可选。规定显示何种错误报告级别的用户定义错误。默认是 "E_ALL"。 |
PHP手册中 errorhandler 的描述:
看代码:
输出:
按照系统报错的格式改造一下:
输出:
说明:
调用 set_error_handler() 时需要注意是,
第一,如果存在该方法,相应的error_reporting()就不能在使用了,所有的错误都会交给自定义的函数处理。
第二,该函数只能捕获系统产生的一些Warning、Notice级别的错误。
说明:
register_shutdown_function可以捕获Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用。
通过这个函数就可以在脚本结束前判断这次执行是否有错误产生,这时就要借助于一个函数:error_get_last();这个函数可以拿到本次执行产生的错误。
看代码:
输出:
改造一下:
输出:
什么是异常:
程序在运行中出现不符合预期的情况或与正常流程不同的情况。一种不正常的情况,按照正常逻辑不该出现,但在写代码时仍然会出现的想不到情况,这是属于逻辑和业务流程的错误,
而不是编译或者语法上的错误。
引入Exception异常处理类:
说明:异常处理的加入使得在 PHP 程序中排查错误、捕获异常更加简单容易,也使得 PHP 程序在健壮性方面有很大改善和提高。异常处理在 PHP 中的具体体现就是,PHP 提供了一
个名叫 Exception 的类完成对 PHP 程序异常的处理,这个类包含了一些处理异常的函数,这些函数可以捕获程序异常和错误。
说明:
示例代码中,在 try 语句块中试着判断当前目录下是否存在名为 test 的目录,如果不存在这个目录,那么就会执行else的代码,通过关键字 throw 抛出异常。
这个异常是一个 Exception 类的对象,通过 new 关键字生成,并且用自定义的错误信息 $msg和错误代码 $code 初始化该对象,用于后面 catch 异常时获取这些信息。
一旦抛出异常,那么 try 语句块中剩下的代码就不再继续执行,程序流程转至相应的 catch 语句块执行,最终通过 Exception 对象调用其成员函数输出错误信息和代码。
说明:函数set_exception_handler()接受一个函数名作为参数,该函数名对应的函数称为异常处理回调函数,它在有异常发生但无代码捕获时被自动调用。被调用之后程序立即终止。
代码实现:
输出: