PHP 程序員也要學(xué)會使用“異?!?/h1>
更新時間:2009年06月16日 22:37:57 作者:
“PHP程序員,特別是從php4,甚至是PHP3中成長起來的程序員,很多都不習(xí)慣使用拋出異常這種錯誤處理方式。雖然php5引入了異常處理機(jī)制,但是很多php程序員還是沒有真正的掌握并使用它。
網(wǎng)站完全開放的特性,決定了網(wǎng)站比任何傳統(tǒng)軟件都更希望做到“系統(tǒng)看起來永遠(yuǎn)都是能夠正常工作的”,所以采用正確的程序錯誤處理方式尤為重要。理論上來說,如果設(shè)計(jì)足夠完美,開發(fā)人員足夠謹(jǐn)慎,程序出現(xiàn)錯誤的可能為0.
但事實(shí)恰恰相反,復(fù)雜的業(yè)務(wù)邏輯,不同的硬件環(huán)境,或者不可信任的用戶輸入,都可能導(dǎo)致程序出錯,服務(wù)當(dāng)機(jī)。所以在稍微有點(diǎn)復(fù)雜的系統(tǒng)中,有個完善的錯誤機(jī)制是必須的。
在php5之前,因?yàn)槿狈Ξ惓5闹С?。在做?fù)雜的開發(fā)時,常常采取比較原始的“處理錯誤數(shù)值+記錄log”的處理形式。
如:
復(fù)制代碼 代碼如下:
function getResult($a,$b)
{
.......
if fatal error occur
return "error_type1";
.....
}
$result = getResult($a,$b);//理論上,getResult函數(shù)總能正確的返回$result
if($result=='error_type1')//但在一些特殊情況.$result無法正常取得
{
writeLog('result is empty!');//記錄下log
die();//或者其他更“友好的”處理方式
}
理論上,通過“處理錯誤數(shù)值+記錄log”的方式也可以達(dá)到我們的目標(biāo)(事實(shí)上確實(shí)如此,在php3,php4的時候,已經(jīng)出現(xiàn)了很多成功且足夠復(fù)雜的系統(tǒng),他們甚至考慮到所有的情況,因此不需要記錄任何log)。但技術(shù)總要向前發(fā)展的,更何況,決大多數(shù)的開發(fā)人員并不具備牛人的嚴(yán)謹(jǐn)?shù)降嗡宦┑乃季S,所以我們還是不得不認(rèn)真思考“如何處理程序錯誤”的問題。
上面的“錯誤處理+記錄log”的方式,存在如下弊端:
1 如果錯誤情況太多,那相應(yīng)的錯誤處理代碼需要增加很多,這非常損害程序的可讀性。你的程序看起來是“斷斷續(xù)續(xù)的”。
2 如果程序的邏輯很復(fù)雜(比如程序的函數(shù)調(diào)用非常復(fù)雜,如在 getResult2()函數(shù) 中調(diào)用 getResult() 的情況,甚至更復(fù)雜的多級嵌套的情況),那錯誤數(shù)值的傳遞處理會讓你疲于奔命。因?yàn)闉榱舜_保錯誤能夠得到有效的處理,你必須保證: 以無損耗的方式傳遞錯誤數(shù)值。
所以,改變這種原始的錯誤處理方式吧。引入異常處理機(jī)制,你會發(fā)現(xiàn)可喜的變化:
1 代碼可讀性大大增強(qiáng)。開發(fā)程序時邏輯思維變得很連貫,在“可疑的”地方,你只要拋出個異常就可以了。至于怎么處理,完全可以等到后面再去補(bǔ)充。當(dāng)然,對于程序的讀者,也不會覺得有被打斷的感覺。
2 再也不需要考慮“錯誤數(shù)值如何無損耗的進(jìn)行傳遞”這種費(fèi)力又不怎么討好的問題了。因?yàn)楫惓O蛏蟼鬟f的特性,你的函數(shù)嵌套個2層,3層,再多層都沒有問題。你只需要在外層有捕獲異常的操作就可以了。
3 異常可以自由的定制,你可以按照功能對異常進(jìn)行分類,更好的管理各種程序錯誤。同時對于你也可以更靈活的定制異常的處理方式。比如,在異常類里面實(shí)現(xiàn)記錄log的功能等。
當(dāng)然,是否使用異常要根據(jù)需求而定。php的一大特性就是部署快,如果是很小的項(xiàng)目,邏輯很簡單,那使用一般的錯誤數(shù)值處理方式也許能夠更快的部署。
相關(guān)文章
-
PHP學(xué)習(xí)筆記之三 數(shù)據(jù)庫基本操作
本文介紹最基本最實(shí)用的數(shù)據(jù)庫操作。首先簡單復(fù)習(xí)下MySQL的使用方法,并且建好一張表備用。MySQL在Linux系統(tǒng)上一般都是裝好的,在win下安裝也很簡單,不多做介紹。 2011-01-01
-
php實(shí)現(xiàn)的驗(yàn)證碼文件類實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的驗(yàn)證碼文件類,實(shí)例分析了php生成驗(yàn)證碼文件的技巧,非常具有實(shí)用價值,需要的朋友可以參考下 2015-06-06
-
php中cookie實(shí)現(xiàn)二級域名可訪問操作的方法
這篇文章主要介紹了php中cookie實(shí)現(xiàn)二級域名可訪問操作的方法,對比了常用的setcookie函數(shù)用法,并給出了一個設(shè)置cookie的類文件來實(shí)現(xiàn)這一功能,是非常實(shí)用的技巧,需要的朋友可以參考下 2014-11-11
-
PHP+RabbitMQ實(shí)現(xiàn)消息隊(duì)列的完整代碼
這篇文章主要給大家介紹了關(guān)于利用PHP+RabbitMQ實(shí)現(xiàn)消息隊(duì)列的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用PHP具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧 2019-03-03
最新評論
但事實(shí)恰恰相反,復(fù)雜的業(yè)務(wù)邏輯,不同的硬件環(huán)境,或者不可信任的用戶輸入,都可能導(dǎo)致程序出錯,服務(wù)當(dāng)機(jī)。所以在稍微有點(diǎn)復(fù)雜的系統(tǒng)中,有個完善的錯誤機(jī)制是必須的。
在php5之前,因?yàn)槿狈Ξ惓5闹С?。在做?fù)雜的開發(fā)時,常常采取比較原始的“處理錯誤數(shù)值+記錄log”的處理形式。
如:
復(fù)制代碼 代碼如下:
function getResult($a,$b)
{
.......
if fatal error occur
return "error_type1";
.....
}
$result = getResult($a,$b);//理論上,getResult函數(shù)總能正確的返回$result
if($result=='error_type1')//但在一些特殊情況.$result無法正常取得
{
writeLog('result is empty!');//記錄下log
die();//或者其他更“友好的”處理方式
}
理論上,通過“處理錯誤數(shù)值+記錄log”的方式也可以達(dá)到我們的目標(biāo)(事實(shí)上確實(shí)如此,在php3,php4的時候,已經(jīng)出現(xiàn)了很多成功且足夠復(fù)雜的系統(tǒng),他們甚至考慮到所有的情況,因此不需要記錄任何log)。但技術(shù)總要向前發(fā)展的,更何況,決大多數(shù)的開發(fā)人員并不具備牛人的嚴(yán)謹(jǐn)?shù)降嗡宦┑乃季S,所以我們還是不得不認(rèn)真思考“如何處理程序錯誤”的問題。
上面的“錯誤處理+記錄log”的方式,存在如下弊端:
1 如果錯誤情況太多,那相應(yīng)的錯誤處理代碼需要增加很多,這非常損害程序的可讀性。你的程序看起來是“斷斷續(xù)續(xù)的”。
2 如果程序的邏輯很復(fù)雜(比如程序的函數(shù)調(diào)用非常復(fù)雜,如在 getResult2()函數(shù) 中調(diào)用 getResult() 的情況,甚至更復(fù)雜的多級嵌套的情況),那錯誤數(shù)值的傳遞處理會讓你疲于奔命。因?yàn)闉榱舜_保錯誤能夠得到有效的處理,你必須保證: 以無損耗的方式傳遞錯誤數(shù)值。
所以,改變這種原始的錯誤處理方式吧。引入異常處理機(jī)制,你會發(fā)現(xiàn)可喜的變化:
1 代碼可讀性大大增強(qiáng)。開發(fā)程序時邏輯思維變得很連貫,在“可疑的”地方,你只要拋出個異常就可以了。至于怎么處理,完全可以等到后面再去補(bǔ)充。當(dāng)然,對于程序的讀者,也不會覺得有被打斷的感覺。
2 再也不需要考慮“錯誤數(shù)值如何無損耗的進(jìn)行傳遞”這種費(fèi)力又不怎么討好的問題了。因?yàn)楫惓O蛏蟼鬟f的特性,你的函數(shù)嵌套個2層,3層,再多層都沒有問題。你只需要在外層有捕獲異常的操作就可以了。
3 異常可以自由的定制,你可以按照功能對異常進(jìn)行分類,更好的管理各種程序錯誤。同時對于你也可以更靈活的定制異常的處理方式。比如,在異常類里面實(shí)現(xiàn)記錄log的功能等。
當(dāng)然,是否使用異常要根據(jù)需求而定。php的一大特性就是部署快,如果是很小的項(xiàng)目,邏輯很簡單,那使用一般的錯誤數(shù)值處理方式也許能夠更快的部署。
相關(guān)文章
PHP學(xué)習(xí)筆記之三 數(shù)據(jù)庫基本操作
本文介紹最基本最實(shí)用的數(shù)據(jù)庫操作。首先簡單復(fù)習(xí)下MySQL的使用方法,并且建好一張表備用。MySQL在Linux系統(tǒng)上一般都是裝好的,在win下安裝也很簡單,不多做介紹。2011-01-01
php實(shí)現(xiàn)的驗(yàn)證碼文件類實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的驗(yàn)證碼文件類,實(shí)例分析了php生成驗(yàn)證碼文件的技巧,非常具有實(shí)用價值,需要的朋友可以參考下2015-06-06
php中cookie實(shí)現(xiàn)二級域名可訪問操作的方法
這篇文章主要介紹了php中cookie實(shí)現(xiàn)二級域名可訪問操作的方法,對比了常用的setcookie函數(shù)用法,并給出了一個設(shè)置cookie的類文件來實(shí)現(xiàn)這一功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11
PHP+RabbitMQ實(shí)現(xiàn)消息隊(duì)列的完整代碼
這篇文章主要給大家介紹了關(guān)于利用PHP+RabbitMQ實(shí)現(xiàn)消息隊(duì)列的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用PHP具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

