PHP5OOP編程中的代理與異常定製(三)

來源:互聯網
上載者:User

現在,你可以實現QueryException類。注重你是如何遍曆調用棧以在指令碼中尋找實際導致錯誤的位置的。這正好適用於當拋出異常的DBQuery對象是一個繼續自DBQuery對象的子類的情況。

  列表5:QueryException類。

/**
*查詢異常
*
*當試圖執行一個查詢時,假如一個錯誤發生,將由{@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;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.