推薦:詳細介紹php5編程中的異常處理1 首先是try,catch
<?php
$path = "D:\\in.txt";
try //檢測異常
{
file_open($path);
}
catch(Exception $e) //捕獲異常
{
echo $e->getMessage();
}
function
列表5:QueryException類。
|
/** *查詢異常 * *當試圖執(zhí)行一個查詢時,如果一個錯誤發(fā)生,將由{@link DBQuery}對象拋出錯誤 */ class QueryException extends Exception { /** * 查詢文本 * * @var字符串$QueryText; */ protected $QueryText; /** *來自數(shù)據(jù)庫的錯誤號/代碼 * * @var字符串$ErrorCode */ protected $ErrorNumber; /** *來自數(shù)據(jù)庫的錯誤消息 * * @var字符串$ErrorMessage */ protected $ErrorMessage; /** *類構(gòu)造器 * * @參數(shù):DBQuery $db,是拋出異常的查詢對象 */ public function __construct(DBQuery $query) { /*得到調(diào)用棧*/ $backtrace = $this->GetTrace(); /*把行和文件設(shè)置到錯誤實際發(fā)生的位置*/ if (count($backtrace) > 0) { $x = 1; /*如果查詢類被繼承,那么我們需要忽略由子類所進行的調(diào)用*/ 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 ) { /*循環(huán)執(zhí)行,只要沒有行號或調(diào)用的函數(shù)是DBQuery類的一個子類*/ $x; /*如果我們到達棧底,那么我們使用第一個調(diào)用者*/ if (($x) >= count($backtrace)) { $x = count($backtrace); break; } } /*如果上面的循環(huán)至少執(zhí)行一次,那么我們可以把它減1以查找實際的引起錯誤的代碼行 */ if ($x != 1) { $x -= 1; } /*最后,我們可以設(shè)置文件和行號,這應該可以反映出引起錯誤的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(); /*調(diào)用超類的異常構(gòu)造器*/ parent::__construct('Query Error', 0); } /** *得到查詢文本 * * @返回字符串查詢文本 */ public function GetQueryText() { return $this->QueryText; } /** *得到錯誤號 * * @返回字符串錯誤號 */ public function GetErrorNumber() { return $this->ErrorNumber; } /** *得到錯誤消息 * * @返回字符串錯誤消息 */ public function GetErrorMessage() { return $this->ErrorMessage; } /** *當對象被轉(zhuǎn)換為一個字符串時調(diào)用。 * @返回字符串 */ public function __toString() { $output = "Query Error in {$this->file} on line {$this->line}nn"; $output .= "Query: {$this->QueryText}n"; $output .= "Error: {$this->ErrorMessage} ({$this->ErrorNumber})nn";
return $output; } }
|
至此,在本節(jié)開始看到的代碼可以工作了。
五、 結(jié)論
在本文中,你看到了代理是怎樣把與查詢相聯(lián)系的DB接口映射到針對一個特定的查詢結(jié)果上的操作。DBQuery對象暴露相同的函數(shù),例如fetch_assoc(),作為DB對象。然而,這些都是針對單個查詢起作用。你還學習了如何使用定制異常來給出詳細信息—一個錯誤發(fā)生在何時何地,以及它們怎樣更好地控制錯誤的處理。
分享:Zend Framework 入門——頁面布局Zend Framework 的頁面布局模塊——Zend_Layout——既可以跟 MVC 一起使用,也可以單獨使用。本文只討論與 MVC 一起使用的情況。
1. 布局腳本
在 application/views 下