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的一个内置异常处理类。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
长按识别二维码并关注微信
更方便到期提醒、手机管理