error

在PHP中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息

错误处理

在创建脚本和Web应用程序时,错误处理是一个很重要的部分,如果你的代码缺少错误检测编码,那么程序就很不专业

错误处理方法为

  • 简单的”die()”语句
  • 自定义错误和错误触发器
  • 错误报告

die()函数

打开文本文件

1
2
<?php
$file=fopen("welcome.txt","r");

如果文件不存在就会得到类似错误
1
2
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in /www/runoob/test/test.php on line 2

为了避免以上错误,访问之前检测该文件是否存在

1
2
3
4
5
6
7
8
9
<?php
if(!file_exists("welcome.txt"))
{
die("文件不存在");
}
else
{
$file=fopen("welcome.txt","r");
}

运行结果
1
文件不存在

自定义错误处理器

创建自定义的错误处理器非常多,很简单地创建一个专用函数,可以在PHP中发生错误时调用该函数

该函数必须要有能力处理两个参数(error level和eroor message),可以最多接受五个参数

语法

1
2
error_function(error_level,error_message,
error_file,error_line,error_context)

参数 | 描述

  • | -
    error_level | 必需。为用户定义的错误规定错误报告级别。必须是一个数字。
    error_message | 必需。为用户定义的错误规定错误信息
    error_file | 可选。规定错误发生的文件名
    error_line | 可选。规定错误发生的行号
    error_context | 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值

错误报告级别

用户自定义的错误处理程序处理的不同类型的错误

常量 描述
2 E_WARNING 非致命的run-time错误。不暂停脚本执行
8 E_NOTICE run-time通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生
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
4096 E_RECOVERABLE_ERROR 可捕获的致命错误。类似E_ERROR,但可被用户定义的处理程序捕获
8191 E_ALL 所有错误和警告

现在创建一个处理错误的函数

1
2
3
4
5
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "脚本结束";
die();

上面的代码就是一个简单的错误处理函数,当它被触发时,它会取得错误级别和错误消息。然后它会输出错误级别和消息,并终止脚本

设立错误处理程序

对于所有错误来使用我们自定义的错误处理程序

1
set_error_handler("customError");

set_error_handler()仅需要一个参数,可以添加第二个参数来规定错误级别

1
2
3
4
5
6
7
8
9
10
11
12
<?php
// 错误处理函数
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}

// 设置错误处理函数
set_error_handler("customError");

// 触发错误
echo($test);

触发错误

在脚本中用户输入数据的位置,当用户的输入无效时触发错误是很有用的,这个任务由trigger_error()函数完成

1
2
3
4
5
6
<?php
$test=2;
if ($test>1)
{
trigger_error("变量值必须小于等于 1");
}

运行结果

1
2
Notice: 变量值必须小于等于 1
in /www/test/runoob.php on line 5

该例子是”test” 变量大于 “1”,就会发生错误

还可以添加的第二个参数,您能够规定所触发的错误类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// 错误处理函数
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "脚本结束";
die();
}

// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);

// 触发错误
$test=2;
if ($test>1)
{
trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}

运行结果

1
2
Error: [512] 变量值必须小于等于 1
脚本结束

错误记录

默认的情况下,根据php.ini中的error_log配置,向服务器的记录系统或文件发送错误记录。通过error_log()函数,可以向指定的文件或远程目的地发送错误记录

通过E-Mail发送错误消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// 错误处理函数
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "已通知网站管理员";
error_log("Error: [$errno] $errstr",1,
"someone@example.com","From: webmaster@example.com");
}

// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);

// 触发错误
$test=2;
if ($test>1)
{
trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}

运行结果

1
2
Error: [512] 变量值必须小于等于 1
已通知网站管理员

接收自以上代码地邮件如下所示
1
Error: [512] 变量值必须小于等于 1

这个方法不适合所有的错误。常规错误应当通过使用默认的 PHP 记录系统在服务器上进行记录

总结

1.直接使用die()函数来在遇到错误时终结程序运行,往往有时候是不太好的

2.set_error_handler() 仅需要一个参数,可以添加第二个参数来规定错误级别

3.触发错误使用trigger_error()函数来进行触发

4.set_error_handler(error_handler,error_type)其中error_handler是必须的,并且要与错误处理函数名称保持一致,error_type是可选项,可以设置错误级别

5.通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录