PHP错误和异常处理

目录:

一、前言

二、错误级别

三、自定义PHP中的错误处理方法

四、自定义异常处理

 

一、前言:

PHP中的错误是什么:

由于php脚本自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。像warning、notice、fatal 都是错误,只是他们的级别不同而已,并且错误是不能被try-catch捕获的。

 

在写PHP程序时,我们基本上使用的是PHP语言中系统自定义的报错方式,例如

例1:在PHP安装目录中查找并打开配置文件php.ini,设置display_errors的值

PHP错误和异常处理

 

 

 

删除前面的分号,并设置值为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的一部分)。

 

三、自定义PHP中的错误处理方法

1:set_error_handler()     

set_error_handler(errorhandler,E_ALL|E_STRICT);

参数

描述

errorhandler 必需。规定用户错误处理函数的名称。
E_ALL|E_STRICT 可选。规定显示何种错误报告级别的用户定义错误。默认是 "E_ALL"。

 

PHP手册中 errorhandler 的描述:

PHP错误和异常处理

 

 

看代码:

PHP错误和异常处理

 

 

输出:

PHP错误和异常处理

 

 

按照系统报错的格式改造一下:

PHP错误和异常处理

 

 

输出:

PHP错误和异常处理

 

 

说明:

调用 set_error_handler() 时需要注意是,

第一,如果存在该方法,相应的error_reporting()就不能在使用了,所有的错误都会交给自定义的函数处理。

第二,该函数只能捕获系统产生的一些Warning、Notice级别的错误。

2:register_shutdown_function()

PHP错误和异常处理

 

 

说明:

register_shutdown_function可以捕获Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用。

通过这个函数就可以在脚本结束前判断这次执行是否有错误产生,这时就要借助于一个函数:error_get_last();这个函数可以拿到本次执行产生的错误。

PHP错误和异常处理

 

 

看代码:

PHP错误和异常处理

 

 

输出:

PHP错误和异常处理

 

 

改造一下:

PHP错误和异常处理

 

 

输出:

PHP错误和异常处理

 

 

四、自定义异常处理

什么是异常:

程序在运行中出现不符合预期的情况或与正常流程不同的情况。一种不正常的情况,按照正常逻辑不该出现,但在写代码时仍然会出现的想不到情况,这是属于逻辑和业务流程的错误,

而不是编译或者语法上的错误。

引入Exception异常处理类:

说明:异常处理的加入使得在 PHP 程序中排查错误、捕获异常更加简单容易,也使得 PHP 程序在健壮性方面有很大改善和提高。异常处理在 PHP 中的具体体现就是,PHP 提供了一

个名叫 Exception 的类完成对 PHP 程序异常的处理,这个类包含了一些处理异常的函数,这些函数可以捕获程序异常和错误。

PHP异常处理(Exception)

PHP错误和异常处理

 

 

PHP错误和异常处理

 

 

例1:使用 try catch 捕获程序中的异常

PHP错误和异常处理

 

 

PHP错误和异常处理

 

 

说明:

示例代码中,在 try 语句块中试着判断当前目录下是否存在名为 test 的目录,如果不存在这个目录,那么就会执行else的代码,通过关键字 throw 抛出异常。

这个异常是一个 Exception 类的对象,通过 new 关键字生成,并且用自定义的错误信息 $msg和错误代码 $code 初始化该对象,用于后面 catch 异常时获取这些信息。

一旦抛出异常,那么 try 语句块中剩下的代码就不再继续执行,程序流程转至相应的 catch 语句块执行,最终通过 Exception 对象调用其成员函数输出错误信息和代码。

2:set_exception_handler()

PHP错误和异常处理

 

 

说明:函数set_exception_handler()接受一个函数名作为参数,该函数名对应的函数称为异常处理回调函数,它在有异常发生但无代码捕获时被自动调用。被调用之后程序立即终止。

代码实现:

PHP错误和异常处理

 

 

输出:

PHP错误和异常处理

 

上一篇:WARNING: POSSIBLE DNS SPOOFING DETECTED 错误解决办法


下一篇:联想R9000p安装matlab2018a+cuda10.0编译