首页 > php基础 > PHP5OOP编程中的代理与异常定制(三)

PHP5OOP编程中的代理与异常定制(三)

现在,你可以实现QueryException类。注意你是如何遍历调用栈以在脚本中查找实际导致错误的位置的。这正好适用于当抛出异常的DBQuery对象是一个继承自DBQuery对象的子类的情况。

列表5:QueryException类。

<?php
/**
*查询异常
*
*当试图执行一个查询时,如果一个错误发生,将由{@link DBQuery}对象抛出错误
*/
class QueryException extends Exception 
{
 /** 
 * 查询文本
 *
 * @var字符串$QueryText;
 */
 protected $QueryText;
 /** 
 *来自数据库的错误号/代码
 *
 * @var字符串$ErrorCode 
 */ 
 protected $ErrorNumber; 
 /** 
 *来自数据库的错误消息
 * 
 * @var字符串$ErrorMessage 
 */ 
 protected $ErrorMessage; 
 /**
 *类构造器
 *
 * @参数:DBQuery $db,是抛出异常的查询对象
 */
 public function __construct(DBQuery $query) 
 {
  /*得到调用栈*/
  $backtrace = $this->GetTrace(); 
  /*把行和文件设置到错误实际发生的位置*/
  if (count($backtrace) > 0) { 
   $x = 1; 
   /*如果查询类被继承,那么我们需要忽略由子类所进行的调用*/
   while((! isset($backtrace[$x]['line'])) || 
(isset($backtrace[$x]['class']) && is_subclass_of($backtrace[$x]['class'], 'DBQuery')) || 
(strpos(strtolower(@$backtrace[$x]['function']), 'call_user_func')) !== false ) { 
    /*循环执行,只要没有行号或调用的函数是DBQuery类的一个子类*/
    ++$x; 
    /*如果我们到达栈底,那么我们使用第一个调用者*/
    if (($x) >= count($backtrace)) { 
     $x = count($backtrace); 
     break; 
    } 
   }
   /*如果上面的循环至少执行一次,那么我们可以把它减1以查找实际的引起错误的代码行
   */
   if ($x != 1) { 
    $x -= 1; 
   } 
   /*最后,我们可以设置文件和行号,这应该可以反映出引起错误的SQL语句*/
   $this->line = $backtrace[$x]['line']; 
   $this->file = $backtrace[$x]['file']; 
  } 
  $this->QueryText = $query->getCompiledQuery(); 
  $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; 
 } 
 /** 
 *得到错误消息
 * 
 * @返回字符串错误消息
 */ 
 public function GetErrorMessage() 
 { 
  return $this->ErrorMessage; 
 } 
 /** 
 *当对象被转换为一个字符串时调用。
 * @返回字符串
 */ 
 public function __toString() 
 { 
  $output = "Query Error in {$this->file} on line {$this->line}\n\n"; 
  $output .= "Query: {$this->QueryText}\n"; 
  $output .= "Error: {$this->ErrorMessage} ({$this->ErrorNumber})\n\n"; 
  return $output; 
 } 
}

至此,在本节开始看到的代码可以工作了。

五、 结论

在本文中,你看到了代理是怎样把与查询相联系的DB接口映射到针对一个特定的查询结果上的操作。DBQuery对象暴露相同的函数,例如fetch_assoc(),作为DB对象。然而,这些都是针对单个查询起作用。你还学习了如何使用定制异常来给出详细信息—一个错误发生在何时何地,以及它们怎样更好地控制错误的处理。


教程链接:http://www.phprm.com/base/5aa92aafb70709d5281bc084a8804cb5.html

随意转载~但请保留教程地址★

标签:none

发表留言