ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

PHP错误和异常处理

2022-01-20 10:33:59  阅读:164  来源: 互联网

标签:函数 错误 error WARNING ERROR 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

级别

描述

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 的描述:

 

 

看代码:

 

 

输出:

 

 

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

 

 

输出:

 

 

说明:

调用 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 对象调用其成员函数输出错误信息和代码。

2:set_exception_handler()

 

 

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

代码实现:

 

 

输出:

 

标签:函数,错误,error,WARNING,ERROR,PHP,异常
来源: https://www.cnblogs.com/raohuabing/p/15825258.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有