一般統(tǒng)一的錯(cuò)誤處理機(jī)制是使用[異常],PHP也提供了異常的功能,但異常對(duì)概念及知識(shí)面都有要求,才能用好,為避免復(fù)雜,所以不使用異常作為統(tǒng)一的錯(cuò)誤處理.
網(wǎng)站程序的錯(cuò)誤處理,最常用的就是中斷程序執(zhí)行,顯示給用戶(hù)一個(gè)提示框,比如在控制器中使用 showmessage() 進(jìn)行錯(cuò)誤提示,所以,在控制器中直接使用 showmessage() 中提示即可.
不過(guò),showmessage() 并不適合在類(lèi)方法及函數(shù)中使用,因?yàn)橛袝r(shí)調(diào)用者需要自己對(duì)錯(cuò)誤進(jìn)行處理,比如,錯(cuò)誤提示使用 JS 的 alert() 彈出,而不是顯示一個(gè) html 頁(yè)面,因此,要統(tǒng)一的是類(lèi)方法中及函數(shù)中的錯(cuò)誤處理.
保守的寫(xiě)法是函數(shù)返回 true 或 false,并通過(guò)比如傳地址的參數(shù)傳遞錯(cuò)誤信息:
bool func_name(& $error)
類(lèi)方法則在類(lèi)中定義一個(gè) get_error() 之類(lèi)的方法返回最后一次錯(cuò)誤信息.
但是,當(dāng)出現(xiàn)多層調(diào)用時(shí),比如 調(diào)用者 -> A() -> B() -> C() ,在 C 函數(shù)中出現(xiàn)錯(cuò)誤,這種方式要傳遞錯(cuò)誤信息就很麻煩了:B() 要處理并兼容 C() 的錯(cuò)誤處理,A() 要兼容 B() 的錯(cuò)誤處理.
只有異常才很“自然”地支持錯(cuò)誤信息的向上傳遞,手動(dòng)模擬的向上傳遞代碼寫(xiě)起來(lái)都很麻煩,不愿意寫(xiě).
網(wǎng)站程序的錯(cuò)誤處理,就是想在發(fā)生錯(cuò)誤時(shí)默認(rèn)就給用戶(hù)一個(gè)提示并中斷程序執(zhí)行,并且當(dāng)調(diào)用者需要自定義如何處理錯(cuò)誤時(shí)允許調(diào)用者自定義.
所以,統(tǒng)一的錯(cuò)誤處理就是默認(rèn)直接對(duì)用戶(hù)進(jìn)行中斷提示,比如數(shù)據(jù)庫(kù)插入錯(cuò)誤,又允許調(diào)用者需要的時(shí)候可以自定義處理錯(cuò)誤,比如使用 JS 彈出錯(cuò)誤信息.
于是,引入 gerr 類(lèi)統(tǒng)一網(wǎng)站程序的錯(cuò)誤處理:
gerr 類(lèi)位于 /include/gerr.class.php,類(lèi)名為 gerr,所有方法都為靜態(tài)方法,無(wú)需也無(wú)法實(shí)例化.Vevb.com
當(dāng)方法或函數(shù)中出現(xiàn)錯(cuò)誤時(shí),調(diào)用 gerr::error() 設(shè)置錯(cuò)誤信息并返回 false.
默認(rèn) gerr::error() 會(huì)調(diào)用 showmessge() 進(jìn)行錯(cuò)誤提示。
當(dāng)調(diào)用者需要自定義處理錯(cuò)誤時(shí),可以調(diào)用 gerr::func_set() 設(shè)置一個(gè)自定義的錯(cuò)誤處理函數(shù),gerr::error() 便會(huì)調(diào)用調(diào)用者設(shè)置的錯(cuò)誤處理函數(shù)進(jìn)行錯(cuò)誤處理.
一般來(lái)說(shuō)錯(cuò)誤處理方式都是由控制器決定的,所以 gerr::func_set() 一般是在控制器中調(diào)用。可以使用 gerr::func_reset() 把錯(cuò)誤處理函數(shù)重置為默認(rèn)函數(shù)。
在方法和函數(shù)中,可以使用 gerr::check() 檢查是否已發(fā)生錯(cuò)誤(一般發(fā)生錯(cuò)誤都需要中斷程序執(zhí)行,不中斷繼續(xù)執(zhí)行只會(huì)發(fā)生更多的錯(cuò)誤),防止已發(fā)生的錯(cuò)誤未被處理.
若類(lèi)方法或函數(shù)使用“流程”的形式組織(比如要先 fopen 后才能 fwrite),在流程開(kāi)始時(shí)調(diào)用 gerr::start() 讓 gerr 進(jìn)行流程的初始化,在流程成功完成后調(diào)用 gerr::end() 通知 gerr 流程已結(jié)束。
可以使用 gerr::get() 取得錯(cuò)誤信息。
一個(gè)使用 gerr 的函數(shù)示例:
- function myerr()
- {
- if (false)
- {
- gerr::error('發(fā)生錯(cuò)誤了', __FILE__, __LINE__, __FUNCTION__);
- return false; //開(kāi)源軟件:Vevb.com
- }
- return true
- }
新聞熱點(diǎn)
疑難解答