PHP错误处理

简介

PHP 对一些内部的错误情况进行报错。 这些错误可以用来表示不同的情况,可以根据需要将错误显示出来或记录到日志中。
每个 PHP 产生的错误都包含了类型。可查看 错误类型清单,它附带了不同类型行为的简短描述和 产生的原因。

错误类型清单

常量 说明
1 E_ERROR (int) 致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。
2 E_WARNING (int) 运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。
4 E_PARSE (int) 编译时语法解析错误。解析错误仅仅由分析器产生。
8 E_NOTICE (int) 运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。
16 E_CORE_ERROR (int) 在 PHP 初始化启动过程中发生的致命错误。该错误类似 E_ERROR,但是是由 PHP 引擎核心产生的。
32 E_CORE_WARNING (int) PHP 初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由 PHP 引擎核心产生的。
64 E_COMPILE_ERROR (int) 致命编译时错误。类似 E_ERROR,但是是由 Zend 脚本引擎产生的。
128 E_COMPILE_WARNING (int) 编译时警告 (非致命错误)。类似 E_WARNING,但是是由 Zend 脚本引擎产生的。
256 E_USER_ERROR (int) 用户产生的错误信息。类似 E_ERROR,但是是由用户自己在代码中使用 PHP 函数 trigger_error()来产生的。
512 E_USER_WARNING (int) 用户产生的警告信息。类似 E_WARNING,但是是由用户自己在代码中使用 PHP 函数 trigger_error()来产生的。
1024 E_USER_NOTICE (int) 用户产生的通知信息。类似 E_NOTICE,但是是由用户自己在代码中使用 PHP 函数 trigger_error()来产生的。
2048 E_STRICT (int) 启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。
4096 E_RECOVERABLE_ERROR (int) 可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见 set_error_handler()),将成为一个 E_ERROR 从而脚本会终止运行。
8192 E_DEPRECATED (int) 运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。
16384 E_USER_DEPRECATED (int) 用户产生的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。
32767 E_ALL (int) 所有错误、警告和通知。

示例

开发调试环境

在开发调试环境中,便于开发者第一时间发现错误,一般将错误直接打印到屏幕上。
代码示例:

//设置错误报告级别:报告除了E_NOTICE、E_WARNING以外的所有错误
error_reporting(E_ALL^E_NOTICE^E_WARNING);
//将错误信息输出打印到屏幕
ini_set('display_errors', '1');

生产环境

在生产环境中,通常不在页面中直接显示错误,而是把错误信息记录到日志中。
代码示例:

<?php
//设置错误报告级别:报告所有错误
error_reporting(E_ALL);
//屏幕上不输出错误报告
ini_set('display_errors', 0);
//设置将脚本运行的错误信息记录到服务器错误日志
ini_set("log_errors",1);
//设置错误日志文件的位置
ini_set("error_log", __DIR__."/error.log");

开启了报错仍然不显示错误的解决办法

不显示错误的原因

如果在php.ini中禁用了display_errors,然后使用ini_set()来开启display_errors,则只有在执行包含该ini_set()行后才会启用。
也就是说,你通过ini_set('display_errors', '1');开启报错的这个php文件本身不能有错误,否则连ini_set都没有执行,则无法显示错误信息(因为php.ini里设置了不显示)

解决办法1:

在php.ini中开启报错。

解决办法2:

新写一个php文件(确保不能有语法错误),引入有错误的文件。
示例:
例如如下这个文件(test.php):

<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
echo 'error'

最后一行忘记写;,但此时访问test.php时,页面显示500错误,并不显示具体的错误信息。

解决办法是新写一个php文件,并将test.php包含进去。
例如新建一个test2.php,内容如下:

error_reporting( E_ALL );
ini_set( "display_errors", 1 );
require_once( "test.php" );

此时访问test2.php则可以看到具体的错误信息了。

发表评论

邮箱地址不会被公开。 必填项已用*标注