• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

PHP异常处理和错误处理

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
PHP中的$_SERVER[&quot;HTTP_REFERER&quot;]用法浅谈发布时间:2022-07-10
下一篇:
关于ebay平台接口(php)对接示例发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap