PHP5 OOP编程之代理与定制异常(2)

上传人:飞*** 文档编号:40374012 上传时间:2018-05-26 格式:DOCX 页数:7 大小:21.93KB
返回 下载 相关 举报
PHP5 OOP编程之代理与定制异常(2)_第1页
第1页 / 共7页
PHP5 OOP编程之代理与定制异常(2)_第2页
第2页 / 共7页
PHP5 OOP编程之代理与定制异常(2)_第3页
第3页 / 共7页
PHP5 OOP编程之代理与定制异常(2)_第4页
第4页 / 共7页
PHP5 OOP编程之代理与定制异常(2)_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《PHP5 OOP编程之代理与定制异常(2)》由会员分享,可在线阅读,更多相关《PHP5 OOP编程之代理与定制异常(2)(7页珍藏版)》请在金锄头文库上搜索。

1、PHP5 OOP 编程之代理与定制异常编程之代理与定制异常(2)发布时间:2006-9-28 10:41 作者: 朱先忠编译 信息来源: 天极开发 我来说两句(1830 条)三、三、 抛出异常抛出异常你可能已经从上面的代码中注意到,你捕获的是一个称为 QueryException(我们将在后面实现这个对象对象)的异常。一个异常类似于一个错误,然而却更具有一般性。描述一个异常的最好的方法是使用emergency。尽管一个 emergency 可以不会是“致命的”,但是还是必须处理它。当在 PHP 中抛出一个异常时,执行的当前范围很快地被终止,不管它是一个函数,try.catch 块还是脚本本身。

2、然后,该异常遍历调用栈终止每个执行范围,直到或者在一个 try.catch 块中捕获它或者它到达调用栈的顶部此时它将生成一个致命错误。异常处理是 PHP 5 中的另外一个新特征,当与 OOP 联用时,它能够实现良好地控制错误处理和报告报告。一个 try.catch 块是一种处理异常的重要机制。一旦被捕获,脚本将会从异常被捕获和被处理的代码的下一行继续执行。如果查询失败,你需要改变你的 execute 函数以抛出一个异常。你将抛出一个称为 QueryException的定制异常对象导致错误的 DBQuery 对象被传递给它。列表 3.抛出一个异常。/*执行当前查询* 执行当前查询用提供的参数代替

3、任何点位符* .* 参数: mixed $queryParams,. 查询参数* 返回:资源 A参考描述执行查询的资源。*/public function execute($queryParams = )/例如: SELECT * FROM table WHERE name=:1S AND type=:2I AND level=:3N$args = func_get_args();if ($this-stored_procedure) /*调用 compile 函数以得到查询*/$query = call_user_func_array(array($this, compile), $args

4、); else /*一个存储过程没被初始化,因此,作为一种标准查询来执行之*/$query = $queryParams;$result = $this-db-query($query);if (! $result) throw new QueryException($this);$this-result = $result;/* 注意现在我们怎么返回对象本身,这使我们能够从这个函数的返回结果中调用成员函数*/return $this;四、四、 使用继承抛出定制异常使用继承抛出定制异常在 PHP 中,你可以抛出任何对象作为一个异常;但是,首先该异常应该继承自 PHP 的内置异常类。通过创建你自

5、己的定制异常,你可以记录其它有关于该错误的信息,例如在一个日志文件中创建一个入口,或做你喜欢做的任何事情。你的定制异常将要做如下几件事情: 记录由查询产生的来自 DB 对象的错误消息。 给出查询错误发生所在行代码的准确细节通过检查调用栈。 显示错误消息和查询文本当被转换成一个字符串时。为了得到错误信息和查询文本,需要对 DBQuery 对象作多处更改。1. 一个新的 protected 属性compiledQuery需要被添加到类中。2. compile()函数使用查询文本更新查询 compiledQuery 属性。3. 应该加入一个检索编译的查询文本的函数。4. 还应该加入一个函数它得到当前

6、的与 DBQuery 对象相关联的 DB 对象。列表 4.抛出一个异常。class DBQuery/*在调用 compile()或 execute()之后存储查询的编译版本* var string $compiledQuery*/protected $compiledQuery;/* 返回编译的查询而不执行它。* 参数:mixed $params,.查询参数* 返回:字符串编译的查询*/public function compile($params=)if (! $this-stored_procedure) throw new Exception(“存储过程没被初始化.“);/*代替参数*/

7、$params = func_get_args(); /得到函数参数$query = preg_replace(“/(?compile_callback($params, 1, “2“), $this-query);return ($this-compiledQuery = $this-add_strings($query); /把字符串放回查询中public function getDB()return $this-db;public function getCompiledQuery()return $this-compiledQuery;现在,你可以实现 QueryException 类

8、。注意你是如何遍历调用栈以在脚本中查找实际导致错误的位置的。这正好适用于当抛出异常的 DBQuery 对象是一个继承自 DBQuery 对象的子类的情况。列表 5:QueryException 类。/*查询异常*当试图执行一个查询时,如果一个错误发生,将由link DBQuery对象抛出错误*/class QueryException extends Exception/* 查询文本* var 字符串$QueryText;*/protected $QueryText;/*来自数据库数据库的错误号/代码* var 字符串$ErrorCode*/protected $ErrorNumber;/*来

9、自数据库的错误消息* var 字符串$ErrorMessage*/protected $ErrorMessage;/*类构造器* 参数:DBQuery $db,是抛出异常的查询对象*/public function _construct(DBQuery $query)/*得到调用栈*/$backtrace = $this-GetTrace();/*把行和文件设置到错误实际发生的位置*/if (count($backtrace) 0) $x = 1;/*如果查询类被继承,那么我们需要忽略由子类所进行的调用*/while(! isset($backtrace$xline) |(isset($bac

10、ktrace$xclass) /*如果我们到达栈底,那么我们使用第一个调用者*/if ($x) = count($backtrace) $x = count($backtrace);break;/*如果上面的循环至少执行一次,那么我们可以把它减 1 以查找实际的引起错误的代码行*/if ($x != 1) $x -= 1;/*最后,我们可以设置文件和行号,这应该可以反映出引起错误的 SQL 语句*/$this-line = $backtrace$xline;$this-file = $backtrace$xfile;$this-QueryText = $query-getCompiledQue

11、ry();$this-ErrorNumber = $query-getDB()-errno();$this-ErrorMessage = $query-getDB()-error();/*调用超类的异常构造器*/parent:_construct(Query Error, 0);/*得到查询文本* 返回字符串查询文本*/public function GetQueryText()return $this-QueryText;/*得到错误号* 返回字符串错误号*/public function GetErrorNumber()return $this-ErrorNumber;/*得到错误消息*

12、返回字符串错误消息*/public function GetErrorMessage()return $this-ErrorMessage;/*当对象被转换为一个字符串时调用。* 返回字符串*/public function _toString()$output = “Query Error in $this-file on line $this-linenn“;$output .= “Query: $this-QueryTextn“;$output .= “Error: $this-ErrorMessage ($this-ErrorNumber)nn“;return $output;至此,在本节开始看到的代码可以工作工作了。五、五、 结论结论在本文中,你看到了代理是怎样把与查询相联系的 DB 接口映射到针对一个特定的查询结果上的操作。DBQuery 对象暴露相同的函数,例如 fetch_assoc(),作为 DB 对象。然而,这些都是针对单个查询起作用。你还学习了如何使用定制异常来给出详细信息一个错误发生在何时何地,以及它们怎样更好地控制错误的处理。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号