您的位置 首页 php

PHP 错误以及异常的处理

1.php.ini中的error_reporting的错误级别设置

错误报告级别:指定了在什么情况下,脚本代码中的错误(这里的错误是广义的错误,包括E_NOTICE注意、E_WARNING警告、E_ERROR致命错误等)会以错误报告的形式输出。

设置错误报告级别的方法:

1)修改PHP的配置文件php.ini

这种方式设置error_reporting后,重启web服务器,就会永久生效。

这里以xampp集成软件包为例,打开配置文件php.ini,查看错误报告级别error_reporting的默认值,如下:

error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT

意思是报告所有的错误,但除了E_DE pre CATED和E_STRICT这两种。

将其修改为:

error_reporting=E_ALL & ~E_NOTICE

意思是报告所有的错误,但除了E_NOTICE这一种。这也是最常用的错误报告级别,它不会报告注意类(如:使用了未定义的变量)的错误。

保存,重启web服务器后生效。

2)使用error_reporting()函数

这种方式设置后,可以立即生效。但仅限于在当前脚本中的error_reporting()函数调用的后面区域。

int error_reporting ([ int $level ] )

参数可以是整型或对应的常量标识符,推荐使用常量的形式。返回值为当前位置处起作用的错误报告级别的值(整型值)。

下面列举一些错误报告级别:

值 常量 说明

1 E_ERROR 报告导致脚本终止运行的致命错误

2 E_WARNING 报告运行时的警告类错误(脚本不会终止运行)

4 E_PARSE 报告编译时的语法解析错误

8 E_NOTICE 报告通知类错误,脚本可能会产生错误

32767 E_ALL 报告所有的可能出现的错误(不同的PHP版本,常量E_ALL的值也可能不同)

error_reporting(E_ALL ^ E_NOTICE); // 除了E_NOTICE之外,报告所有的错误

error_reporting(E_ERROR); // 只报告致命错误

echo error_reporting(E_ERROR | E_WARNING | E_NOTICE); // 只报告E_ERROR、E_WARNING 和 E_NOTICE三种错误

注意:配置文件php.ini中display_errors的默认值为On,代表显示错误提示,如果设置为Off,就会关闭所有的错误提示。

例:warning.php

<?php

include (“not_exist_inc.php”);//由于没有找到文件,产生两个警告信息,但是PHP解析器仍然继续解析脚本,并运行print “Hello!\n”;

print “Hello!\n”;

not_exist_func();//由于没有找到函数,产生一个致命的错误信息,PHP解析器停止运行,所以不会解析下面print “Hello!\n”;

print “Hello!\n”;

?>

结果:

parse_error.php

<?php

123456;abcdef //产生一个语法错误,所以PHP解析器退出,就不会解析后面的代码

require “not_exist_inc.php”;

not_exist_func();

print “Hello!\n”;

?>

结果:

2.display_errors的错误显示设置

例:error_report.php

<?php

//ini_set(‘display_errors’, ‘off’);

include “not_exist_inc.php”;

print “Hello!\n”;

not_exist_func();

print “Hello!\n”;

?>

结果:

<?php

ini_set(‘display_errors’, ‘off’);//关闭显示错误信息

include “not_exist_inc.php”;//警告信息将被屏蔽

print “Hello!\n”;

not_exist_func();//错误信息将被屏蔽

print “Hello!\n”;

?>

结果:

注:如果想调试某部分代码,这时候就可以使用这个配置屏蔽掉不想调试的部分代码错误信息,只显示特定的代码信息。

3.使用error_reporting函数更改当前错误级别设置

定义和用法

error_reporting() 函数跪地你给应该报告何种 PHP 错误。

error_reporting() 函数能够在运行时设置 error_reporting 指令。

PHP 有诸多错误级别,使用该函数可以设置在脚本运行时的级别。如果没有设置可选参数 level,error_reporting() 仅会返回当前的错误报告级别。

语法

error_reporting(level);

参数描述

level

可选。规定新的 error_reporting 级别。可以是一个位掩码也可以是一个已命名的常量。

注释:强烈建议使用已命名的常量,以确保兼容将来的版本。由于错误级别的添加、整数取值范围的增加,较久的基于整数的错误级别不会总是和预期的表现一致。

可用的错误级别常量及其实际含义描述在了 predefined constants 中。

返回值:返回旧的 error_reporting 级别,或者在 level 参数未给出时返回当前的级别。

例:

<?php

// 关闭错误报告

error_reporting(0);

// 报告 runtime 错误

error_reporting(E_ERROR | E_WARNING | E_PARSE);

// 报告所有错误

error_reporting(E_ALL);

// 等同 error_reporting(E_ALL);

ini_set(“error_reporting”, E_ALL);

// 报告 E_NOTICE 之外的所有错误

error_reporting(E_ALL & ~E_NOTICE);

?>

结果:

4.强制退出函数exit

定义和用法

exit() 函数输出一条消息,并退出当前脚本。

该函数是 die() 函数的别名。

语法

exit(status)

参数描述

status必需。规定在退出脚本之前写入的消息或状态号。状态号不会被写入输出。

说明

如果 status 是 字符串 ,则该函数会在退出前输出字符串。

如果 status 是整数,这个值会被用作退出状态。退出状态的值在 0 至 254 之间。退出状态 255 由 PHP 保留,不会被使用。状态 0 用于成功地终止程序。

例:exit.php

<?php

$filename = ‘/filename’; //文件

$file = fopen($filename, ‘rw’) or exit(“不能打开文件($filename)”);//安装读写方式打开文件或者提示错误信不能打开文件($filename)

?>

结果:

注:exit不是一个真正的函数,而是一个语言结构类型,并且在PHP中还有一个与exit()作用相同的函数die()。

5.使用trigger_error手动触发用户级的错误

定义和用法

trigger_error() 函数创建用户级别的错误消息。

trigger_error() 函数能结合内置的错误处理器所关联,或者可以使用用户定义的函数作为新的错误处理程序(set_error_handler())。

语法

trigger_error(errormsg,errortype);

参数描述

errormsg必需。规定错误消息。最大长度 1024 字节。

errortype

可选。规定错误类型。可能的值:

E_USER_ERROR

E_USER_WARNING

E_USER_NOTICE(默认)

返回值:如果规定了错误的 errortype,则返回 FALSE。否则返回 TRUE。

例:trigger_error.php

<?php

$divisor=0;

if (assert($divisor == 0)) {//assert这个函数在php语言中是用来判断一个表达式是否成立。

trigger_error(“除数不能为零”, E_USER_NOTICE);//创建用户级别的错误消息。

}

?>

结果:

6.使用自定义的错误处理函数

set_error_handler() 函数设置用户自定义的错误处理函数。 该函数用于创建运行时期间的用户自己的错误处理方法。 该函数会返回旧的错误处理程序,若失败,则返回 null。

语法

set_error_handler(error_function,error_types)

参数描述

error_function必需。规定发生错误时运行的函数。

error_types可选。规定在哪个错误报告级别会显示用户定义的错误。默认是 “E_ALL”。

提示和注释

提示:如果使用了该函数,会完全绕过标准的 PHP 错误处理函数,如果必要,用户定义的错误处理程序必须终止 (die() ) 脚本。 注意:如果在脚本执行前发生错误,由于在那时自定义程序还没有注册,因此就不会用到这个自定义错误处理程序。

例:set_error.php

<?php

function UserHandler($ errno , $errstr, $errfile, $errline)//自定义的错误处理函数形参$errno为产生错误的级别, $errstr为错误信息字符串, $errfile为产生错误信息的文件的文件名, $errline为产生错误信息的语句在源码中的行号

{

switch ($errno) {

case E_USER_ERROR://检测错误信息是否是E_USER_ERROR

print “<b>E_USER_ERROR</b>:\n”;

print “代码是$errno \n”;

print “错误信息字符串是 $errstr \n”;

print “错误发生在文件 $errfile 的第 $errline 行\n”;

print “程序中止…<br />\n”;

exit(1);

break ;

case E_USER_WARNING://检测错误信息是否是E_USER_WARNING

print “<b>E_USER_WARNING</b>:\n”;

print “代码是$errno \n”;

print “错误信息字符串是 $errstr \n”;

print “错误发生在文件 $errfile 的第 $errline 行\n”;

break;

case E_USER_NOTICE://检测错误信息是否是E_USER_NOTICE

print “<b>E_USER_NOTICE</b>:\n”;

print “代码是$errno \n”;

print “错误信息字符串是 $errstr \n”;

print “错误发生在文件 $errfile 的第 $errline 行\n”;

break;

default://默认为未知错误类型

echo “未知错误: [$errno] $errstr<br />\n”;

break;

}

}

function check($a, $b) //创建一个check函数 形参$a, $b

{

if (!is_numeric($b) || $b <= 0) { //产生一个E_USER_ERROR类型的错误信息

trigger_error(“第二个参数b小于0”, E_USER_ERROR); //产生一个用户级别的错误信息

}

if (!is_array($a)) {//产生一个E_USER_WARNING类型的错误信息

trigger_error(“第一个参数a不是数组”, E_USER_WARNING);//产生一个用户级别的错误信息

return null;

}

for ($i=0; $i<count($a); $i++) {//产生一个E_USER_NOTICE类型的错误信息

if (!is_numeric($a[$i]))

trigger_error(“参数a中第 $i 个元素不是数字”, E_USER_NOTICE);//产生一个用户级别的错误信息

}

}

print ‘<pre>’;

error_reporting(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE);//更改当前错误级别设置

set_error_handler(“UserHandler”);//使用自定义的错误处理函数

$error_array = array(2,3, “string”, 5.5, 43.3, 21.11);

$b = check($error_array, ‘123’);

$c = check(123, 2.3);

$d = check($error_array, -2.5);

print ‘</pre>’;

?>

结果:

7.抛出异常与捕获异常

try ……throw……catch

Try – 使用异常的函数应该位于 “try” 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。

Throw – 这里规定如何触发异常。每一个 “throw” 必须对应至少一个 “catch”

Catch – “catch” 代码块会捕获异常,并创建一个包含异常信息的对象

例:exception.php

<?php

echo ‘<pre>’;

try { //开始对try语句包含的模块进行异常检查

$error = ‘这是一个异常信息’;

throw new Exception($error); //抛出一个异常类,包含了错误信息

echo ‘不会执行’;

} catch (Exception $e) { //开始异常处理模块

echo ‘<b>捕获了异常:</b> ‘.$e->getMessage().”\n”;

}

echo ‘正常代码信息’; //开始执行常规代码

echo ‘</pre>’;

?>

结果:

注:throw语句必须在try语句块作用域内才有意义。

对于throw语句抛出的Exception类本身是PHP的一个内置异常处理类。

请大家多多关注,点赞,本文只供学习之用……

文章来源:智云一二三科技

文章标题:PHP 错误以及异常的处理

文章地址:https://www.zhihuclub.com/78172.shtml

关于作者: 智云科技

热门文章

网站地图