PHP异常处理和错误处理

1. PHP捕捉异常

try...catch...

<?php
function divide($x) {
    if(!$x) {
        throw new Exception('Division by zero!');
    }
    else
        return 1/$x;
}
try {
echo divide(5);
echo divide(0);
}
catch(Exception $e) {
    echo $e->getMessage();
}
?>

参考: php try catch的使用  http://blog.sina.com.cn/s/blog_610997850100utea.html

重点:

异常触发时, 后续的代码不会再被执行, php会去执行匹配的catch代码块;

异常触发, 但是没有捕获(即没有catch), 且没有使用set_exception_handler, 将发生一个致命错误.

set_exception_handler()函数可以参考: http://cn.php.net/set_exception_handler

 

2. PHP捕获错误

set_error_handler

<?php
function   runtimeErrorHandler($level,$string) 
{
    //自定义错误处理时,手动抛出一个异常实例
    throw   new   Exception($level.'|'.$string); 
} 

//设置自定义错误处理函数
set_error_handler( "runtimeErrorHandler");

try
{
    $a=2/0;  
    //这里制造一个以前无法截获的除0错误
}
catch(Exception $e)
{
    echo 'error information:', $e->getMessage();
    //显示错误,这里就可以看到错误级别和错误信息了“2|Division by zero”
}
?>

使用set_error_handler()函数时, 会绕过php标准的处理函数.

参考: http://www.w3school.com.cn/php/func_error_set_error_handler.asp

http://hi.baidu.com/longlong8304/blog/item/bf247f0ea02edb366159f339.html

奇怪的是, set_time_limit()的错误不能被捕捉到, 这是为什么呢? 求教...

<?php
function   runtimeErrorHandler($level,$string) 
{
    //自定义错误处理时,手动抛出一个异常实例
    throw   new   Exception($level.'|'.$string); 
} 

//设置自定义错误处理函数
set_error_handler( "runtimeErrorHandler");

try
{
set_time_limit ( 1 );
for($i = 0; $i < 500000; $i ++) {
    echo $i . " line: \n";
}
}
catch(Exception $e)
{
    echo 'error information:', $e->getMessage();
    //显示错误,这里就可以看到错误级别和错误信息了“2|Division by zero”
}
?>

 

3. PHP捕获致命错误的方法

register_shutdown_function 

<?php
function shutdown() {
    echo 'Script executed with success', PHP_EOL;
}
register_shutdown_function('shutdown');
?>

当然,任何的程序中断都会触发用此方法注册的函数,包括exit()等等。如果想只用来处理某段程序的致命错误,这时需要进行一下判断,可以参考一下代码:

<?php
class Test {
    private $running;
    public function __construct() {
        register_shutdown_function(array($this, 'shutdown_handler'));
    }
    public function main() {
        $this->running = true;  //开始监测
        echo "Hello ";
        $this->error();  //(undefined method)触发一个致命错误
        echo "World ";      
        $this->running = false;  //结束监测
    }
    public function shutdown_handler() {
        if ($this->running) {
            echo '抱歉出错了~';
            @header("Location: error.php");   
        }
    }
}
$t = new Test();
$t->main();
?>

参考: http://blog.sweetfree.net/article/default/544.html

 

set_time_limit()超时错误捕获

<?php
$es = ini_get('error_reporting');
error_reporting(0);
register_shutdown_function('runError');
set_time_limit ( 1 );

for($i = 0; $i < 500000; $i ++) {
    echo $i . " line: \n";
}
error_reporting($es);   // 关键步骤

function runError () {
    echo 'niubility, i just catch the set_time_limit fatal error!';
}
?>

 

附: 

http://wenku.baidu.com/view/c6c40711cc7931b765ce15b8.html

posted on 2012-06-08 00:22  DavidYanXW  阅读(920)  评论(0编辑  收藏  举报