編程中的異常處理機制
- 2019 年 11 月 11 日
- 筆記
城邊編程 phplog
讀完需要
6
分鐘
速讀僅需3分鐘
有人問我對於華為HR胡玲的事情怎麼看?
在馬克思主義政治經濟學中,剝削指的是生產者(無產者)為所有者(資本家)以低於實際補償的價格進行工作。無產者被迫出售自己的勞動,而不是一定量的勞動,以獲得工資,維持生計。資本家則剝削無產者的成果,聚斂剩餘價值。因此,資本家通過擁有生產資料來獲利,而勞工則被剝奪了成果的所有權。
正文
異常處理又稱為錯誤處理,用來解決程序運行時出現的意外或異常情況。異常處理一般有兩種模型,終止模型和恢復模型。
『終止模型』指在程序運行時只要異常被拋出就已無法挽回,程序將終止運行。『恢復模型』指程序運行出錯之後能提供修正的方法,讓程序繼續執行。任何編程語言都是基於這兩種模型處理異常。
恢復模型可以理解為常用的`try catch`,終止模型可以理解為項目中無法支配的神秘力量。所以不要認為程序員就能掌控程序,大多時候他們連異常都掌控不了。
終止模型會導致服務中斷,沒有重來的機會,解決辦法是對日誌做監控及時的叫醒程序員起床修復。恢復模型會給程序一次重來的機會,在面向對象的語言中實現方法大同小異,如下:
try{ // 可能拋出異常的語句 }catch(exceptionType variable){ // 處理異常的語句 }
try是「檢測」的意思,用來檢測語句塊有沒有異常,catch 是「抓住」的意思,用來捕獲並處理 try 檢測到的異常。如果 try 語句塊沒有檢測到異常,那麼就不會執行 catch 中的語句。說的有點拗口,簡單點說:
try是法律,catch是警察。要是在法律的規定下違法了,警察會抓人(如果違反了交規,就需要交警去抓,catch的參數也很重要)。如果遵紀守法,警察就不會出現。
接下來看看JAVA和PHP的異常處理機制。
Java異常處理機制
Java的異常處理機制非常完善,是行業五星項目,無論你喜不喜歡都要學習他的異常處理。因為Java需要將代碼編譯成二進制碼,所以Java的異常類型也分為兩種,Checked Exception 和 Unchecked Exception。
Checked Exception指編譯時檢查是否加了異常判斷,比如寫了IO操作但沒有檢測IO異常(IOException)會提示編譯錯誤。自定義的Exception都應該是Checked Exception,以便於最大化利用Java編譯器的編譯時檢查。
Unchecked Exception指編譯時不檢查的異常,Unchecked Exception又分為可捕獲的異常和無法捕獲的異常。比如空指針異常(NullPointerException)就是可捕獲的異常。Error就是無法捕獲的異常,會導致程序終止。如下圖

作為行業標杆,Java的異常處理機制遠不止這些,這裡不展開講。感興趣的朋友可以Google。
PHP的異常處理
相比Java,PHP的異常處理就有些山寨,早期的PHP不支持面向對象編程,到PHP5才引入了面向對象的相關語法。所以異常處理是PHP的錯誤處理系統向面向對象演進後的產物。
Java在編譯時會檢測Checked Exception,不處理編譯無法通過。PHP少了編譯的步驟,所以無法原生的實現對異常的檢測。好在我們可以通過第三方工具去檢測異常的處理,比如利用編輯器的提示功能,在gitlab中集成代碼檢測功能等。雖然是曲線救國,但也算朝着標準在努力。
我曾經看到有開發人員直接給入口函數加`try catch`,將整個請求都包裹起來就是非常糟糕的做法,這樣做不但會影響程序的性能還會將一些應該暴露的問題隱藏。
很多開發者不清楚什麼時候該用`try catch`。按正常的開發規範,應該檢查調用的函數是否會拋出異常(主流的編輯器都有提示功能),然後進行相應的處理,尤其是使用第三方編寫的PHP組件和框架時。比如調用PHP的`file_get_contents`函數時就可能返回異常,所以使用`file_get_contents`要加`try catch`。
PHP異常處理相關配置
PHP提供了靈活的異常處理配置,很方便進行開發調試,對生產環境的未知錯誤做預警等。
;顯示錯誤 display_startup_errors = On display_errors = On ;報告所有錯誤 error_reporting = -1 ;記錄錯誤 log_errors = On 在生產環境中設置 php.ini 文件的錯誤報告方式如下: ;不顯示錯誤 display_startup_errors = Off display_errors = Off ;除了notice級別錯誤外,報告所有其他錯誤 error_reporting = E_ALL & ~E_NOTICE ;記錄錯誤 log_errors = On 如果生產環境有缺陷,我們一般通過查看 PHP 錯誤日誌來定位問題。
推薦一個PHP的錯誤展示包,可通過composer直接安裝。
//使用文檔可直接查看擴展包的readme文件 composer require filp/whoops --dev
最後