1 回答

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個贊
在java、python等語言中,異常對于我們來說已經(jīng)是必不可少的錯誤處理方式。異常處理是面向?qū)ο缶幊讨械囊环N很強(qiáng)大的特性,然而很多PHPer對它不了解,甚至認(rèn)為它會破壞代碼結(jié)構(gòu)。即使在很多開源項(xiàng)目中,也難以見到異常的蹤影。那么,PHP中的異常,到底有沒有意義呢?
PHP有兩種錯誤處理機(jī)制,一種是內(nèi)置錯誤,一種是異常。
內(nèi)置錯誤,包含error、warning、notice等錯誤類型。很多PHP的內(nèi)置函數(shù),和一些PHP擴(kuò)展,都會使用這種類型的錯誤。此類錯誤的優(yōu)勢是處理起來比較方便。不重要的錯誤,可以通過配置php選項(xiàng)來忽略它。我們甚至可以通過set_error_handler()函數(shù),來集中處理非致命的錯誤。但是,PHP的寬容往往會讓程序員養(yǎng)成一個壞習(xí)慣,那就是在代碼中留下大量warning、notice級別的錯誤。這樣對程序的調(diào)試和后期維護(hù)帶來很多不便。而且致命的錯誤(Fatal Error),是沒有辦法處理的。這也是PHP的一大硬傷。
在PHP中使用異常有以下優(yōu)勢:
一、異常能提高程序的健壯性。
在需要處理錯誤的場景,異常能讓我們輕松掌控程序,采取相應(yīng)的處理措施。并不是所有的異常都需要處理。在一些異常發(fā)生時,沒有其他替代方案,這時我們可以記錄一些錯誤日志,并讓程序崩潰。在web應(yīng)用里,我們可以給用戶顯示一個500錯誤頁面來增強(qiáng)用戶體驗(yàn)。一些PHP的開源庫會提供大量的異常類型,這樣會幫助我們快速找出代碼錯誤,減少程序BUG。
二、異常處理能增強(qiáng)程序的可維護(hù)性。
函數(shù)應(yīng)該有一系列的輸入,并且有唯一的輸出。在參數(shù)不正確、或者發(fā)生系統(tǒng)錯誤時,我們需要告知使用者發(fā)生了什么樣的錯誤,便于使用者處理和記錄。
利用返回值、引用變量來返回錯誤在PHP程序中很常見:
123456789 | function ?foo( $var )?{ ???? if ?(! is_int ( $var ))?{ ???????? return ?array (-1,? '參數(shù)1必須是整數(shù)' ); ???? } ???? if ?( $var ?<=?0)?{ ???????? return ?array (-2,? '參數(shù)1必須大于0' ); ???? } ???? return ?$var ; } |
這樣的函數(shù)使用非常不方便。使用者需要通過判斷函數(shù)的返回值,來確保程序是否正常運(yùn)行。額外的邏輯判斷,會降低程序的可讀性。
假如函數(shù)被修改為這樣:
123456789 | function ?foo( $var )?{ ???? if ?(! is_int ( $var ))?{ ???????? return ?array (-1,? '參數(shù)1必須是整數(shù)' ); ???? } ???? if ?( $var ?<=?0)?{ ???????? return ?array (-2,? '參數(shù)1必須大于0' ); ???? } ???? return ?array ( $var ,? '' ); } |
這時你外層的判斷邏輯就需要修改,是不是很麻煩?
使用異常,在執(zhí)行失敗時拋出異常,可以讓函數(shù)的輸出非常干凈,避免額外的處理。減少了代碼量,也增強(qiáng)了程序的可維護(hù)性。
三、使用異常有助于我們集中處理錯誤。
在程序拋出異常時,只要沒有遇到try catch,異常會逐漸向函數(shù)調(diào)用堆棧頂層傳遞。這樣我們不需要每一層都處理錯誤。我們可以在程序的入口處集中處理所有未處理的異常,有助于我們發(fā)現(xiàn)潛在的程序BUG。而一個只會返回正常處理結(jié)果和錯誤代碼的函數(shù),在其出錯時不得不立即處理。如果我們想在代碼頂層再處理這個錯誤,就不得不一層一層返回這個錯誤,給程序設(shè)計(jì)帶來很多不便。
綜上,我們應(yīng)該盡量使用異常,保證程序的可靠性。
- 1 回答
- 0 關(guān)注
- 607 瀏覽
添加回答
舉報