首页 > 编程笔记 > PHP笔记 阅读:3

PHP中的错误处理(附带实例)

在编写 PHP 程序时,如果没有对程序中可能存在的问题进行处理,一旦程序的逻辑存在漏洞,上线后就会出现很多安全问题。

错误处理是程序的一个重要组成部分,在程序中恰当地使用错误处理可以提高程序的安全性,同时也方便开发人员检查代码。本节将对 PHP 中的错误处理进行详细讲解。

PHP错误类型

PHP 有多种错误类型,如 Notice、Warning和Fatal error 等,每个错误类型都有一个常量与之关联,还可以使用具体的值来表示。

常见的错误类型如下表所示:

表 1 常见的错误类型
常量 描述
E_ERROR 1 致命的运行时错误,这类错误不可恢复,会导致脚本停止运行
E_WARNING 2 运行时警告,仅给出提示信息,脚本不会停止运行
E_PARSE 4 编译时语法解析错误,说明代码存在语法错误,脚本无法运行
E_NOTICE 8 运行时通知,表示脚本遇到可能会表现为错误的情况
E_CORE_ERROR 16 类似 E_ERROR,是由 PHP 引擎核心产生的
E_CORE_WARNING 32 类似 E_WARNING,是由 PHP 引擎核心产生的
E_COMPILE_ERROR 64 类似 E_ERROR,是由 Zend 脚本引擎产生的
E_COMPILE_WARNING 128 类似 E_WARNING,是由 Zend 脚本引擎产生的
E_USER_ERROR 256 类似 E_ERROR,是由用户在代码中使用 trigger_error()产生的
E_USER_WARNING 512 类似 E_WARNING,是由用户在代码中使用 trigger_error()产生的
E_USER_NOTICE 1024 类似 E_NOTICE,是由用户在代码中使用 trigger_error()产生的
E_STRICT 2048 严格语法检查,确保代码具有互用性和向前兼容性
E_RECOVERABLE_ERROR 4096 可被捕捉的致命错误
E_DEPRECATED 8192 运行时通知,对未来版本中可能无法正常工作的代码给出警告
E_USER_DEPRECATED 16384 类似 E_DEPRECATED,是由用户在代码中使用 trigger_error()产生的
E_ALL 32767 所有的错误、警告和通知

为了使读者更好地理解这些错误类型,下面对开发过程中经常遇到的 Notice、Warning 和 Fatal error 类型的错误进行演示。

1) Notice

Notice 类型的错误通常是代码不严谨造成的,示例代码如下:
// 使用未定义的变量
echo $var;          // 提示信息:Notice:Undefined variable…
当使用未定义的变量时,应先判断变量是否存在,从而避免遇到 Notice 类型的错误。在实际开发中,不建议忽略 Notice 类型的错误,应尽量保持代码的严谨性和准确性。

2) Warning

Warning 错误相比 Notice 更严重一些,示例代码如下:
// 使用include引入不存在的文件
include '1234';  // 提示信息:Warning: include(1234): Failed to open stream…
使用 include 语句引入文件前,应先判断相应文件是否存在,以防止错误发生。

3) Fatal error

Fatal error 是致命错误,一旦发生这种错误,PHP 脚本会立即停止运行,示例代码如下:
display();        // Fatal error:Uncaught Error:Call to undefined function…
echo 'hello';     // 前一行代码发生错误,此行代码不会执行
在上述示例代码中,在调用未定义的函数 display() 时发生了致命错误,输出语句没有执行。致命错误是在 PHP 脚本运行时发生的,一旦发生此类错误,脚本会立即停止运行。

PHP错误信息

当程序出错时,PHP 会报错,报错的信息称为错误信息。在 PHP 中可以对错误信息进行控制,一般通过两种方式控制,一种方式是错误报告,另一种方式是错误日志。

1) 错误报告

开启或关闭错误报告有两种方式,一种是修改配置文件,另一种是调用 error_reporting() 函数和 ini_set() 函数。

PHP 的配置文件 php.ini 中已经默认开启了错误报告,示例配置如下:
error_reporting = E_ALL
display_errors = On
在上述配置中,error_reporting 用于设置错误类型常量,默认值 E_ALL 表示报告所有的错误、警告和通知,如需关闭错误报告可设置为 0;display_errors 用于设置是否显示错误信息,默认值 On 表示显示,如需关闭则设置为 Off。

error_reporting() 函数用于设置错误级别常量,ini_set() 函数用于设置 php.ini 中指定选项的值,通过 error_reporting() 函数和 ini_set() 函数开启错误报告的示例代码如下:
error_reporting(E_ALL);
ini_set('display_errors', On);
在上述示例代码中,error_reporting() 函数中可以设置的错误常量参考表 1。ini_set() 函数的第 1 个参数为 display_errors;第 2 个参数的值为 On(也可以使用 1 代替)表示开启,如果想要关闭则设置为 Off(也可以使用 0 代替)。

2) 错误日志

在生产环境中,如果直接将程序的错误信息输出到网页中,会影响用户体验。此时,可以将这些错误信息记录到错误日志中,为后期解决这些错误提供帮助。

记录错误日志的方式有两种,具体介绍如下:
1) 通过修改php.ini配置文件记录错误日志。在 PHP 的配置文件 php.ini 中添加错误日志的配置,具体配置如下:
error_reporting = E_ALL;
log_error = On
error_log = C:\web\php_errors.log
在上述配置中,error_reporting 用于设置错误类型的常量,log_error 用于设置是否记录日志,error_log 用于指定错误日志文件的路径。

2) 通过error_log()函数记录错误日志。error_log() 函数能够将错误信息记录到指定的日志中。该函数的第 1 个参数是错误信息;第 2 个参数用于指定将错误信息记录到何处,默认记录到 php.ini 中 error_log 配置的日志中;第 3 个参数用于指定错误日志文件的路径。

使用 error_log() 函数记录错误日志的示例代码如下:
// 将错误信息记录到php.ini中error_log配置的日志文件中
error_log('error message a');
// 将错误信息记录到错误日志文件
error_log('error message b', 3, 'C:/web/php.log');
在上述示例代码中,如果省略 error_log() 函数的第 2 个和第 3 个参数,则将错误信息记录到 php.ini 中 error_log 配置的日志文件中;如果将 error_log() 函数的第 2 个参数设置为 3,表示将错误信息记录到指定的文件中。

在程序中进行错误处理时,我们需要观察现有的代码,根据现有代码的逻辑规则,分析和判断程序可能存在的问题,并提出解决方案。这种分析和判断的能力使我们能够更加深入地思考和解决问题,从而提高程序的质量。

相关文章