PHP語言簡單的緣由之一就是PHP的錯誤處理機制,隨着PHP語言愈來愈現代化,也出現了異常,這篇博文就是簡單說下錯誤和異常,以便系統的理解,另外對於任何一種語言來講,異常的存在是具有共性的,因此學習一門語言理解異常機制是必不可少的php
當PHP語言遇到異常的狀況(好比數據庫鏈接不上或者函數參數傳遞錯誤),則會報出一些錯誤,錯誤能夠分爲多種類型,除了E_ERROR和E_CORE_ERROR錯誤,其它錯誤不會終止程序運行.前端
PHP讓人以爲簡單的緣由就在於程序不會頻繁的報錯,給人一種編寫流暢和方便的錯覺.java
也正由於這個緣由PHP程序的嚴謹性和準確性差了很多,好比mysql_fetch_array查詢遇到網絡錯誤返回FALSE的時候(程序沒有終止運行),假如調用程序認爲查詢沒有匹配的數據,則這個程序本質是錯誤的.mysql
經過 php.ini的指令 error_reporting或者動態調用 error_reporting()函數咱們能夠選擇報告什麼類型的錯誤,經過 display_errors指令則能夠控制錯誤是否在線輸出.而 error_log指令能夠控制將錯誤輸出到日誌中.面試
不論是系統函數或者是自定義函數,假如內部遇到錯誤,如何告之調用者呢?通常是經過函數返回 TRUE或者 FALSE來代表.這種處理方式有幾個弊端:sql
● 調用者只知道發生了錯誤,可是返回的錯誤信息太少,且缺少錯誤類型的說明數據庫
● 程序處理邏輯和錯誤處理混雜在一塊,產生的代碼會很是的不清晰.segmentfault
一個小技巧: error_get_last()函數會返回最近錯誤產生的具體緣由.網絡
● set_error_handler()函數來託管全部的錯誤框架
● trigger_error()函數能夠觸發自定義錯誤,能夠用來在函數中代替 return 語句
● 將全部的錯誤輸出到日誌中,同時定義錯誤類型
● 對用戶顯示錯誤,好比將錯誤以一種更友好的方式返回給用戶
● 生產環境下 display_errors指令要關閉,開發環境則該指令打開
老牌的PHP框架 Codeigniter處理錯誤的方式能夠借鑑
function _error_handler($severity, $message, $filepath, $line) { $is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); //輸出500錯誤HTTP狀態碼 if ($is_error) { set_status_header(500); } //對於不須要處理的錯誤則直接中斷 if (($severity & error_reporting()) !== $severity) { return; } //將全部的錯誤記錄到日誌中 $_error =& load_class('Exceptions', 'core'); $_error->log_exception($severity, $message, $filepath, $line); //友好的輸出全部錯誤 if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))){ $_error->show_php_error($severity, $message, $filepath, $line); } //假如致命錯誤則直接退出 if ($is_error) { exit(1); } } set_error_handler('_error_handler');
● 異常能夠自定義,SPL提供了不少類型的異常,你也能夠擴展它
● 異常最常規的動做就是捕獲,這樣開發者就能根據具體的錯誤進行後續處理.好比能夠根據異常的上下文給用戶返回友好的提示.或者繼續拋出一個異常,讓上游的程序去處理.假如仍是沒有捕獲異常,那麼程序就直接終止了.
● 異常另外個動做就是拋出,假如經過函數編寫業務邏輯,遇到意外的狀況,能夠直接扔出一個異常.
● 異常能夠被代碼一層一層捕獲,假如最外層的程序尚未捕獲,則代碼直接終止運行
● PHP中的異常假如不能捕獲,則做爲致命錯誤寫入到系統錯誤日誌中
function inverse($x) { if ($x < 10) { throw new Exception('x<10'); } elseif ($x >= 10 and $x < 100) { throw new LogicException('x>=10 and x<100'); } return $x; } try { echo inverse(2)."\n"; } catch (LogicException $e) { echo 'Caught LogicException: ', $e->getMessage(), "\n"; } catch (Exception $e) { echo 'Caught Exception: ', $e->getMessage(), "\n"; throw $e; }
● 異常可讓代碼更加清晰,讓開發者專一於業務邏輯的編寫.
● 構建可擴展的異常是很是有技術性的,難道SPL異常還作的不夠嗎?
● 捕獲異常應該僅僅捕獲本層能處理的異常,對於不能處理的異常則讓上游的代碼處理.
PHP7鼓勵使用異常來代替錯誤,可是不可能一會兒推翻錯誤處理機制,須要兼容,因此只能慢慢過渡.
可是能夠經過變通的方式來統一使用異常
PHP中定義了一個 Error異常,注意這個異常和 Exception是並列的,
當打開嚴格模式的時候,PHP7中不少的錯誤是被 Error異常拋出的.這樣就能統一使用異常了.
declare (strict_types = 1); function add(int $a, int $b) { return $a + $b; } try { echo add("3", "4"); } catch (TypeError $e) { //TypeError繼承自Error echo $e->getMessage(); }
ErrorException繼承自 Exception.
咱們能夠經過 set_error_handler()函數將全部的錯誤轉換成 ErrorException.這樣就能愉快的統一使用異常了.
以上就是系統化理解PHP中的錯誤和異常的詳細內容,但願對你有所幫助。
前端開發緊密相關的HTTP協議知識
蹭B站源碼泄露的熱點來聊聊B站有趣的源碼片斷
跨平臺技術Flutter的將來
java中內部接口與外部接口的區別
點擊驗證碼,更換驗證碼的value值
php工程師面試須要注意哪些方面?