php 错误处理经验分享

本教程介绍了 PHP 中一些最为重要的错误检测方法。

我们将为您讲解不同的错误处理方法:

简单的 "die()" 语句
自定义错误和错误触发器
错误报告
基本的错误处理:使用 die() 函数
第一个例子展示了一个打开文本文件的简单脚本:


代码如下:

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

如果文件不存在,您会获得类似这样的错误:

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2为了避免用户获得类似上面的错误消息,我们在访问文件之前检测该文件是否存在:


代码如下:

<?php
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>

现在,假如文件不存在,您会得到类似这样的错误消息:

File not found比起之前的代码,上面的代码更有效,这是由于它采用了一个简单的错误处理机制在错误之后终止了脚本。

不过,简单地终止脚本并不总是恰当的方式。让我们研究一下用于处理错误的备选的 PHP 函数。
创建自定义错误处理器
创建一个自定义的错误处理器非常简单。我们很简单地创建了一个专用函数,可以在 PHP 中发生错误时调用该函数。

该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 以及 error context):

语法
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,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191 E_ALL

所有错误和警告,除级别 E_STRICT 以外。

(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)

现在,让我们创建一个处理错误的函数:


代码如下:

function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}

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

现在,我们已经创建了一个错误处理函数,我们需要确定在何时触发该函数。
Set Error Handler
PHP 的默认错误处理程序是内建的错误处理程序。我们打算把上面的函数改造为脚本运行期间的默认错误处理程序。

可以修改错误处理程序,使其仅应用到某些错误,这样脚本就可以不同的方式来处理不同的错误。不过,在本例中,我们打算针对所有错误来使用我们的自定义错误处理程序:

set_error_handler("customError");由于我们希望我们的自定义函数来处理所有错误,set_error_handler() 仅需要一个参数,可以添加第二个参数来规定错误级别。

实例
通过尝试输出不存在的变量,来测试这个错误处理程序:


代码如下:

<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}

//set error handler
set_error_handler("customError");

//trigger error
echo($test);
?>

以上代码的输出应该类似这样:

Error: [8] Undefined variable: test触发错误
在脚本中用户输入数据的位置,当用户的输入无效时触发错误的很有用的。在 PHP 中,这个任务由 trigger_error() 完成。

例子
在本例中,如果 "test" 变量大于 "1",就会发生错误:


代码如下:

<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>

以上代码的输出应该类似这样:

Notice: Value must be 1 or below
in C:\webfolder\test.php on line 6您可以在脚本中任何位置触发错误,通过添加的第二个参数,您能够规定所触发的错误级别。

可能的错误类型:
E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
E_USER_NOTICE - 默认。用户生成的 run-time 通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生。
例子
在本例中,如果 "test" 变量大于 "1",则发生 E_USER_WARNING 错误。如果发生了 E_USER_WARNING,我们将使用我们的自定义错误处理程序并结束脚本:


代码如下:

<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}

//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

以上代码的输出应该类似这样:

Error: [512] Value must be 1 or below
Ending Script现在,我们已经学习了如何创建自己的 error,以及如何处罚它们,现在我们研究一下错误记录。
错误记录
默认地,根据在 php.ini 中的 error_log 配置,PHP 向服务器的错误记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。

通过电子邮件向您自己发送错误消息,是一种获得指定错误的通知的好办法。

通过 E-Mail 发送错误消息
在下面的例子中,如果特定的错误发生,我们将发送带有错误消息的电子邮件,并结束脚本:


代码如下:

<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

以上代码的输出应该类似这样:

Error: [512] Value must be 1 or below
Webmaster has been notified接收自以上代码的邮件类似这样:

Error: [512] Value must be 1 or below这个方法不适合所有的错误。常规错误应当通过使用默认的 PHP 记录系统在服务器上进行记录。

错误回溯

定义和用法
PHP debug_backtrace() 函数生成一个 backtrace。

该函数返回一个关联数组。下面是可能返回的元素:


































名称 类型 描述
function 字符串 当前的函数名。
line 整数 当前的行号。
file 字符串 当前的文件名。
class 字符串 当前的类名
object 对象 当前对象。
type 字符串 当前的调用类型,可能的调用:
  • 返回: "->"  - 方法调用
  • 返回: "::"  - 静态方法调用
  • 返回 nothing - 函数调用
args 数组 如果在函数中,列出函数参数。如果在被引用的文件中,列出被引用的文件名。
语法
debug_backtrace()例子


代码如下:

<?php
function one($str1, $str2)
{
two("Glenn", "Quagmire");
}
function two($str1, $str2)
{
three("Cleveland", "Brown");
}
function three($str1, $str2)
{
print_r(debug_backtrace());
}

one("Peter", "Griffin");
?>

输出:

Array
(
[0] => Array
(
[file] => C:\webfolder\test.php
[line] => 7
[function] => three
[args] => Array
(
[0] => Cleveland
[1] => Brown
)
)
[1] => Array
(
[file] => C:\webfolder\test.php
[line] => 3
[function] => two
[args] => Array
(
[0] => Glenn
[1] => Quagmire
)
)
[2] => Array
(
[file] => C:\webfolder\test.php
[line] => 14
[function] => one
[args] => Array
(
[0] => Peter
[1] => Griffin
)
)
)

(0)

相关推荐

  • PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法

    异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程.这种情况称为异常. PHP 5 添加了类似于其它语言的异常处理模块.在 PHP 代码中所产生的异常可被 throw 语句抛出并被 catch 语句捕获.需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常.每一个 try 至少要有一个与之对应的 catch.使用多个 catch 可以捕获不同的类所产生的异常.当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一

  • php一些错误处理的方法与技巧总结

    1:为什么我得不到变量 我在一网页向另一网页POST数据name,为什么输出$name时却得不到任何值? 在PHP4.2以后的版本中register_global默认为off 若想取得从另一页面提交的变量: 方法一:在PHP.ini中找到register_global,并把它设置为on. 方法二:在接收网页最前面放上这个extract($_POST);extract($_GET);(注意extract($_SESSION)前必须要有Session_Start()). 方法三:一个一个读取变量$a

  • PHP 自定义错误处理函数trigger_error()

    定义和用法trigger_error() 函数创建用户定义的错误消息. trigger_error() 用于在用户指定的条件下触发一个错误消息.它与内建的错误处理器一同使用,也可以与由 set_error_handler() 函数创建的用户自定义函数使用. 如果指定了一个不合法的错误类型,该函数返回 false,否则返回 true. 语法trigger_error(error_message,error_types) 参数描述error_message必需.规定错误消息.长度限制为 1024 个

  • PHP错误处理函数

    在 PHP 中,默认的错误处理很简单.一条错误消息会被发送到浏览器,这条消息带有文件名.行号以及描述错误的消息. PHP 错误处理 在创建脚本和 Web 应用程序时,错误处理是一个重要的部分.如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门. 本教程介绍了 PHP 中一些最为重要的错误检测方法. 我们将为您讲解不同的错误处理方法: 简单的 "die()" 语句 自定义错误和错误触发器 错误报告 基本的错误处理:使用 die() 函数 第一个实例展示了一个打开

  • PHP 自定义错误处理函数的使用详解

    复制代码 代码如下: function myErrorHandler($errno, $errstr, $errfile, $errline){    if(!(error_reporting() &$errno)){return;}    switch ($errno){    case E_USER_ERROR:        echo "<b>My ERROR</b> [$errno] $errstr<br/>";        ech

  • 使用PHP的错误处理

    在web 上所有常见的错误之一就是无效的链接.一旦从其它站点上出现了无效的链接,你会重新安排你 的站点.人们会将他们喜欢的站点存成书签,如果在三个月后再次访问时,仅仅发现的是'404 Not Fount ' 时,将不会给他们任务帮助,告诉他们如何从你的站点去查找原始的信息.让我们解决这个问题,或者至少 给你的用户一个友好的帮助,一旦他们遇到'a 404' 错误时,能够得到一些痕迹.你可以创建普通的页面来 报告在处理你的页面时所遇到的所有的错误. PHP 与Apache一起可以很自由地让你创建自已

  • PHP中PDO的错误处理

    面向对象的方式 先看看如果连接错误等的处理,PHP中PDO的错误处理,使用面向对象的方式来处理: 复制代码 代码如下: <?php try { $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass); $db = null; } catch (PDOException $e) { print "Error: " . $e->getMessage() . "<br/>";

  • PHP中的错误处理、异常处理机制分析

    例: 复制代码 代码如下: <?php $a = fopen('test.txt','r'); //这里并没有对文件进行判断就打开了,如果文件不存在就会报错 ?> 那么正确的写法应该如下: 复制代码 代码如下: <?php if(file_exists('test.txt')){ $f=fopen('test.txt','r'); //使用完后关闭 fclose($f); } ?> 一.PHP错误处理的三种方式A.简单的die()语句: 等价于exit(); 例: 复制代码 代码如

  • php 错误处理经验分享

    本教程介绍了 PHP 中一些最为重要的错误检测方法. 我们将为您讲解不同的错误处理方法: 简单的 "die()" 语句 自定义错误和错误触发器 错误报告 基本的错误处理:使用 die() 函数 第一个例子展示了一个打开文本文件的简单脚本: 复制代码 代码如下: <?php $file=fopen("welcome.txt","r"); ?> 如果文件不存在,您会获得类似这样的错误: Warning: fopen(welcome.txt

  • Java异常区分和处理的一些经验分享

    异常处理的一些经验总结 这篇文章主要是对Java异常选择和使用中的一些误区的总结和归纳,希望各位读者能够熟练掌握异常处理的一些注意点和原则.只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验,提高产品的价值.废话少说,直接看: 误区一.异常的选择 这张图描述了异常的结构,其实我们都知道异常分检测异常和非检测异常,但是在实际中又混淆了这两种异常的应用.由于非检测异常使用方便,很多开发人员就认为检测异常没什么用处.其实异常的应用情景可以概括为以下: 1.调用代码不能继续执行

  • pycharm第三方库安装失败的问题及解决经验分享

    一.报错信息:[file][Default Settint]---Project Interpreter 点击搜索suds安装模块报错 解决:依据上图提示找到C:\Program Files\JetBrains\PyCharm 2017.2.3\helpers\packaging_tool.py 文件的192行和109行 将do_install函数和do_uninstall函数修改为如下格式 def do_install(pkgs): try: try: from pip._internal i

  • MySQL从库维护经验分享

    前言: MySQL 主从架构应该是最常用的一组架构了.从库会实时同步主库传输来的数据,一般从库可以作为备用节点或作查询使用.其实不只是主库需要多关注,从库有时候也要经常维护,本篇文章将会分享几点从库维护经验,一起来学习吧. 1.主从复制建议采用 GTID 模式 GTID 即全局事务 ID(Global Transaction ID),GTID 实际上是由 server_uuid:transaction_id 组成的.其中 server_uuid 是一个 MySQL 实例的唯一标识, transa

  • php-fpm优化总结经验分享

    目录 Nginx 与 php-fpm 运行流程 Nginx 与 php-fpm 通信机制 php-fpm 进程管理 php-fpm 优化 php.ini 优化 php-fpm.conf 优化 如何避免程序 hang 死 Nginx 与 php-fpm 运行流程 Nginx 查看 nginx.conf 配置文件 加载 nginx 的 fast-cgi 模块 php-fpm 监听 127.0.0.1:9000 php-fpm 接收到请求,启用 worker 进程处理请求 php-fpm 处理完请求,

  • oracle数据库ORA-01196错误解决办法分享

    上一篇文章中我们了解到oracle常见故障类别及规划解析,接下来,我们看看oracle数据库ORA-01196错误解决的相关内容,具体如下: 问题现象 在使用shutdown abort停DataGuard备库后,备库不能open,报ORA-01196错误. 发现一备库不能应用日志,查看备库日志没发现报错,怀疑是备库应用日志服务停止,于是尝试重启备库: 可能因为备库是读业务比较繁忙,在shutdown immediate关闭备库时等时间过长,于是使用了shutdown abort命令: 但后面在

  • 巧妙解决Oracle NClob读写问题(经验分享)

    最近一个新项目中,尝试在 Oracle 数据库中使用 NCLOB 来保存大的 xml 字符串. 在代码自动生成工具(通过 JDBC 驱动程序,读数据库表结构,自动生成对应的 java 代码,包含增加.删除.修改.分页查询.根据主键查找等前台 html/js.后台代码 java),将 NCLOB 字段映射到 String 类型. 运行代码,无报错.使用 SQuirreL SQL 客户端查看数据,觉察数据未保存成功. 网上搜一通,有提到用 SetBigStringTryClob  的数据库连接额外属

  • 使用bootstrap validator的remote验证代码经验分享(推荐)

    这里需要说一下,bootstrapvalidator的帮助文档写的比较简单,对于remote验证器的说明更是如此,在经历多方测试之后才明白如何使用这个验证器. 一个典型的ajax验证代码如下: 服务端验证代码(使用spring mvc)如下: /* * 返回String类型的结果 * 检查用户名的合法性,如果用户已经存在,返回false,否则返回true(返回json数据,格式为{"valid",true}) */ @RequestMapping(value = "/chec

  • 手动挡汽车如何开省油的经验分享

    怎样开车最省油 一.新车磨合 新车在最初的3000公里行驶里程之内一定要磨合.新车磨合要注意时速控制在每小时80公里以内:尽量减少急加速.急减速. 二.合理保养汽车--定期保养 要知道车况良好的汽车可省油15%到20%. 1.空气滤清器.汽油滤清器.机油滤清器:每行驶5000公里以上配件都需要更换,因为空滤堵塞会引起气量减少,导致汽油燃烧不充分,降低燃油效率,而汽油滤清器的阻塞也会使发动机工作异常. 2.机油:加机油需要适量,注意机油标尺所标示的刻度.机油太多将曲轴淹没,增大阻力:机油太少则无法

  • MYSQL跨服务器同步数据经验分享

    项目需要,自己找了些资料和亲手配置过后:得出的经验分享. (1)主服务器 修改配置文件/etc/my.cnf(my.ini) [mysqld] # mysql-bin是log文件的前缀,也可以使用其它的名字,比如服务器名 # 如果不带路径,会把log文件写到`/var/lib/mysql`下 log-bin=mysql-bin # serverid在一个同步体系中必须是唯一的,大于等于1且小于2^32-1的整数 server-id=1 binlog-do-db = 数据库名 (你要备份的数据库)

随机推荐