PHP中的错误和异常处理

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

不同的错误处理方法:

l  简单的 "die()" 语句

l  自定义错误和错误触发器

l  错误报告


Ø  die() 语句(与exit()相同)

<?php

if(!file_exists("welcome.txt")){

 die("File not found");

} else {

 $file=fopen("welcome.txt","r");

}

?>

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

File not found

 

Ø  PHP的错误报告级别

  级别常量

  错误报告描述

  E_ERROR

  致命的运行时错误,它会组织脚本的执行

  E_WARNING

  运行时警告(非致命的错误)

  E_PARSE

  从语法中解析错误

  E_NOTICE

  运行时注意消息(可能是或可能不是一个问题)

  E_CORE_ERROR

  类似E_ERROR,但不包括PHP核心造成的错误        

  E_CORE_WARNING

  类似E_WARNING,但不包括PHP核心错误报告

  E_COMPILE_ERROR

  致命的编译时错误

  E_COMPILE_WARNING     

  致命的编译时警告

  E_USER_ERROR

  用户导致的错误信息

  E_USER_WARNING

  用户导致的警告

  E_USER_NOTICE

  用户导致的注意消息

  E_ALL

  所有的错误、警告和注意

  E_STRICT

  关于PHP版本移植的兼容性和互操作性建议

 

Ø  可以通过在php.ini配置文件中将display_errors指令的值设置为On,开启PHP输出错误报告的功能。可以调用函数ini_set()函数,动态设置配置文件的某个指令。(如ini_set(“display_errors”,1));

 

Ø  在网站投入使用时应该禁用错误报告的输出,即设置display_errors为Off;

 

Ø  可以在php.ini中通过设置error_reporting的值调整错误报告的级别,可以把位运算符&(与)|(或)~(非)和错误级别常量一起使用:

  error_reporting=E_ALL&~E_NOTICE //抛出任何非注意的错误,默认值

  error_reporting=E_ERROR|E_PARSE|E_CORE_ERROR  //只考虑致命的运行时错误,解析错误和核心错误

  error_reporting=E_ALL&~(E_USER_ERROR| E_USER_WARNING|E_USER_NOTICE)   //报告除用户错误之外的所有错误

  使用函数error_reporting(0)(关闭错误输出)、error_reporting(E_ALL)(抛出所有错误)、error_reporting(E_ALL&~(E_WARNING|E_NOTICE))。

 

Ø  确定PHP错误报告行为的配置指令

  配置指令

  描述

   默认值  

  display_startup_errors

  是否显示PHP引擎在初始化时遇到的所有错误

  Off

  log_errors

  确定日志语句记录的位置

  Off

  error_log

  设置错误可以发送到syslog,可设置为日志文件所在的路径

  Null

  log_errors_max_len

  每个日志项的最大长度,以字节为单位,设置0表示指定最大长度

  1024

  ignore_repeated_errors 

  是否忽略同一文件同一行发生的重复的错误消息

  Off

 ignore_repeated_source 

  忽略不同文件中或同一文件不同行上发生的重复错误

  Off

  track_errors

  启动该指令会使PHP在$php_errormsg中存储最近发生的错误信息       

  Off

 

Ø  使用trigger_error()可以生成一个用户警告,如trigger_error(“errormessage~”, E_USER_ERROR),通过添加的第二个参数,规定所触发的错误级别

可能的错误类型:

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 "EndingScript";

 die();

}

 

//set error handler

set_error_handler("customError",E_USER_WARNING);

 

//trigger error

$test=2;

if ($test>1)

{

 trigger_error("Valuemust be 1 or below",E_USER_WARNING);

}

?>

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

Error: [512] Value must be 1 or below

Ending Script。

 

Ø  自定义错误处理:

function error_handler($error_level, $error_message, $file, $line){ 方法体 }

set_error_handler(“error_handler”);

echo $novar;  //会根据函数输出错误信息

E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING不会被set_error_handler()这个句柄处理,会以最原始的方式显示出来,不过出现这些都是编译或PHP内核出错,通常不会发生。

使用set_error_handler()后,error_reporting()将会失效,即所有错误(除上述错误)都会交给自定义的函数处理。

 

Ø  PHP中写错误日志

使用指定的文件记录错误的报告日志,一定要确保这个文件存放在文档根目录之外,以减少遭到攻击的可能性,并且PHP脚本的执行用户(web服务器的进程所有者)具有写权限。需要对php.ini更改如下:

error_reporting = E_ALL

display_errors = Off

log_errors = On

log_errors_max_len = 1024

error_log = /usr/local/error.log   ;指定产生的错误报告写入的日志文件位置

可以使用error_log()函数送出一个用户自定义的错误信息

bool error_log(string message [, int message_type [, stringdestination [, string extra_headers]]]) 此函数会送出错误信息到Web服务器的错误日志文件、某个TCP服务器或到指定文件中。

message为要送出的错误信息,message_type为0表示送到操作系统的日志;1表示使用PHP的Mail()函数,发送信息到E-mail处,extra_headers也会用到;2则将错误信息送到TCP服务器中,此时destination表示目的地IP及Port;3则将信息存到文件destination中。

a. error_log(“...”, 0);

b. error_log(“...”, 1, “webmaster@domain.com”);

c. error_log(“...”, 2, “localhost”);

d. error_log(“...”, 3, “/usr/local/errors.log”)

将日志记录到操作系统日志中,设置error_log=syslog

PHP提供实现写消息到操作系统日志的需要一起使用的4个专用函数define_syslog_variables()、openlog()、syslog()和closelog()。

示例:

<?php

define_syslog_variables();

openlog(“php5”,LOG_PID, LOG_USER);

syslog(LOG_WARNING, “警告时间:”.date(“Y/m/dH:i:s”));

closelog();


Ø  PHP中的异常处理

处理异常需要的PHP脚本示例

try{

         $error = ‘Always throw this error!’;

         throw new Exception($error);

         echo ‘Never executed’;

} catch (Exception $e) {

         echo ‘Caught exception:’.$e->getMessage().’\n’;

} finally{

         # … code

}

 如果使用自定义的类作为异常处理类,则必须是扩展内置异常类Exception的子类,非Exception类的子类是不能作为异常处理类使用。

 PHP中可以捕获多个异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值