from :http://lzyy.org/blog/archives/42

对于PHP的异常和错误总是有点迷糊,于是花了半个下午的时间,总算是明白了大概。

异常(Exception)是从PHP5开始引入的,一个异常可以通过try{}catch{}的方式,被抛出,被捕获。异常被抛出后,包含在try里面的异常后面的代码就不会被执行,然后会去寻找第一个匹配的catch。如果一个异常没有被捕获,那么就会触发PHP Fatal Error,类似:’Uncaught Exception …’。


难免会有意想不到的异常,所以这时就可以使用set_exception_handler()来统一管理。比如下面这段代码

<?php
function exception_handler($exception) {
echo "Uncaught exception: " , $exception->getMessage(), "\n";
}
 
set_exception_handler('exception_handler');
 
throw new Exception('Uncaught Exception');
echo "Not Executed\n";
?>

没有捕获抛出的异常,但设置了异常处理函数’exception_handler’,这样就可以在函数里做文章了,比如显示一个错误页面,同时记录下异常的内容,方面日后查看。异常处理函数执行完后,PHP就会停止执行后面的语句。

如果是php内部函数执行时出现异常,不会抛出Exception,而是通过trigger_error来显示错误。好在有set_error_handler,可以设置默认错误处理函数,我们在函数里抛出一个异常,这样就可以达到统一处理的效果。

<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new Exception($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
 
/* Trigger exception */
strpos();
?>

或者直接把异常和错误的处理都用一个函数来实现,这样就需要在函数里判断错误的来源是Exception还是error,可以通过参数个数来判断(error总是会有5个参数)

设置error

比较重要的两个参数是:error_reporting和display_errors。在PHP4和PHP5里,error_reporting默认都是E_ALL & ~E_NOTICE(显示所有的错误,但不显示NOTICE类型的)。但在PHP5里又有了一个新的error类型:E_STRICT,它并没有被包含到E_ALL里面,所以需要手动添加,如E_ALL | E_STRICT。

注意:下面的代码里error_reporting是没有效果的

ini_set("display_errors", 1);
//最后少了一个分号
echo 'hello world'

无论是设置display_errors为0或者1,都没有效果,因为PHP是先解析后执行,解析过程中出错,会根据php.ini里的display_errors的设置来决定是否显示错误。可以改为这样

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("file_with_errors.php");
?>