Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543279
  • 博文数量: 119
  • 博客积分: 3167
  • 博客等级: 中校
  • 技术积分: 1215
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-20 21:21
文章分类

全部博文(119)

文章存档

2015年(21)

2012年(4)

2011年(1)

2007年(11)

2006年(50)

2005年(32)

分类: PHP

2015-09-06 15:15:56



FLEA_EXCEPTION_STACK 和 FLEA_EXCEPTION_HANDLER
FLEA_EXCEPTION_STACK存储的是EXCEPTION对象,
FLEA_EXCEPTION_HANDLER存储的是错误对象的调用函数.




比如在数据库操作的时候对一些错误生成exception对象:


        $result = mysql_query($sql, $this->conn);
        if ($result !== false) {
            $this->lasterr = null;
            $this->lasterrcode = null;
            return $result;
        }
        $this->lasterr = mysql_error($this->conn);
        $this->lasterrcode = mysql_errno($this->conn);


        if ($throw) {
            FLEA::loadClass('FLEA_Db_Exception_SqlQuery');
            __THROW(new FLEA_Db_Exception_SqlQuery($sql, $this->lasterr, $this->lasterrcode));
        }
        return false;




然后在使用save,update等调用的时候就能使用 __TRY() , __CATCH() 来捕获异常并进行相应的处理了


    function actionSave() {
        __TRY();
        $this->_modelProducts->saveProduct($_POST);
        $ex = __CATCH();
        if (__IS_EXCEPTION($ex)) {
            return $this->_editProduct($_POST, $ex->getMessage());
        }


        $this->_goBack();
    }






而且还能自定exception类, 而且上面可以看出, 一般的数据库的操作, 通过特定的数据库得到错误代码, 作为参数生成FLEA_Db_Exception_SqlQuery对象
也就是说,这个exception对象,使用不同的数据库,对于相同的一个问题错误代码是不同的, 比如键重复了, 在mysql里是一个错误代码, mssql里是另一个错误代码
于是调用__THROW的时候,传递的错误代码是不同的。  如果要很细致的区分处理捕获的错误, 那么要自己对这个错误代码进行分析处理


exception类里面提供了getMessage , getCode这样的方法


另外  如果调用 __TRY() 之后不需要调用 __CATCH() 捕获异常,则必须用 __CANCEL_TRY() 撤销用 __TRY() 设置的捕获点。一般都是成对使用吧




比如TRY()调用后捕获到一个的异常 


dump($GLOBALS[G_FLEA_VAR]['FLEA_EXCEPTION_STACK']);


在TRY,catche之间可以查看到FLEA_EXCEPTION_STACK这个栈里面有一个exception对象的数组元素


如果这个对象被CATCH()处理了, 这个exception对象会被删除, 栈就是一个空数组  


如果只有TRY, 没有CATCH处理会导致exception一直在stack里面,甚至exception造成混乱?

阅读(650) | 评论(0) | 转发(0) |
0

上一篇: fleaphp mssql 2

下一篇:SQL Server中的标识列

给主人留下些什么吧!~~