摘要:預測和捕獲并處理異常是我們自己的責任,因為未捕獲的異常可能會導致應用終止運行,顯示錯誤信息。處理并記錄異常你的代碼還原成之前的異常處理程序錯誤我們可以使用函數或者在文件中使用指令告訴報告或者忽略那些錯誤。
1).異常是Exception類的對象,在遇到無法修復的狀況時拋出,例如遠程API沒有響應或者數據庫查詢失敗再或者是無法滿足程序運行的前置條件。出現問題的時候異常用于主動出擊,委托職責;異常還可以用于防守,預測潛在的問題來減輕影響。
2).Exception對象和其他的PHP對象一樣,使用new關鍵字實例化。
第一個參數是消息,第二個參數是數字代碼。數字代碼是可選的,用于為指定的異常提供上下文。我們可以使用公開的實例方法getCode和getMessage來獲得異常對象的兩個屬性。
3).假如遇到了異常情況,或者在當前的條件下無法操作,我們需要拋出異常。4).我們必須拋出Exception類或者他的子類,PHP內置的異常類和其子類如下:
Exception
ErrorException
PHP標準庫提供了下述額外的Exception子類,擴展了PHP內置的異常類。
LogicException
BadFunctionCallException
BadMethodCallException
DomainException
InvalidArgumentException
LengthException
OutOfBoundsException
RuntimeException
OutOfBoundsException
OverflowException
RangeException
UnderflowException
UnexpectedValueException
5).捕獲異常。預測和捕獲并處理異常是我們自己的責任,因為未捕獲的異常可能會導致PHP應用終止運行,顯示錯誤信息。攔截并處理潛在異常的方式是,把可能拋出異常的代碼放在在try/catch塊中。
try { $pdo = new PDO("mysql://host=wrong_host;dbname=wrong_name"); } catch (PDOException $e) { $code = $e->getCode(); $message = $e->getMessage(); echo "Something went wrong.Check back soon, please"; exit; }還可以連續拋出多個異常
try { throw new Exception("Not a PDO exception"); $pdo = new PDO("mysql://host=wrong_host;dbname=wrong_name"); } catch (PDOException $e) { echo "Caught PDO exception"; } catch (Exception $e) { //處理其他異常 echo "Caught generic exception"; } finally { //這里的代碼始終都會執行 echo "Always do this"; }捕獲某種異常的時候只會允許其中一個catch塊,如果PHP沒有找到適用的catch塊,異常會向上冒泡,直到PHP腳本由于致命的錯誤而終止。
6).異常處理程序。我們可以使用一個全局的異常處理程序,來捕獲所有未被捕獲的異常。異常捕獲程序都必須接受一個了類型為Exception的參數,異常捕獲程序使用set_exception_handler()函數注冊。錯誤
1).我們可以使用error_reporting()函數或者在php.ini文件中使用error_reporting指令告訴PHP報告或者忽略那些錯誤。這兩種都是使用E_*常量來確定。
2)錯誤報告方式四原則:一定要讓PHP報告錯誤
在開發環境中要顯示錯誤
再生產環境中不能顯示錯誤
在開發和生產環境中都要記錄錯誤
3)一種php.ini配置的例子:
開發環境:;顯示錯誤 display_startup_errors = On display_errors = On ;報告所有錯誤 error_reporting = -1 ; 記錄錯誤 log_errors = On生產環境:
;不顯示錯誤 display_startup_errors = Off display_errors = Off ;除了注意事項外,報告所有錯誤 error_reporting = E_ALL & ~E_NOTICE ; 記錄錯誤 log_errors = On4).注冊全局的錯誤處理程序:set_error_handler()函數。
5.一個簡單的全局錯誤處理程序的例子:
set_error_handler(function($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) { //error_reporting指令沒有設置這個錯誤,所以忽略 return; } throw new ErrorException($errstr, $errno, 0, $errfile, $errline); }); //其他代碼 //還原成之前的錯誤處理程序 restore_error_handler();相關處理組件
開發環境: filp/whoops
生產環境: monolog/monolog
專題系列PHP專題系列目錄地址:https://github.com/xx19941215/webBlog
PHP專題系列預計寫二十篇左右,主要總結我們日常PHP開發中容易忽略的基礎知識和現代PHP開發中關于規范、部署、優化的一些實戰性建議,同時還有對Javascript語言特點的深入研究。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23331.html
摘要:構造異常的子類。代碼的邏輯功能部分如何使用異常的子類文件權限或文件不存在文件損壞錯誤的文件格式后備捕捉器,正常情況下不應該被調用。這樣,可以在細化的子句中,針對不同的錯誤使用不同的恢復或失敗機制。參考深入,面向對象模式與實踐 構造異常的子類。 class XmlException extends Exception { private $error; func...
摘要:否則非法請求參數小則影響用戶體驗或者產生垃圾數據,大則會拖跨整個系統其次,手工對所有的參數進行校驗相當繁瑣,容易出錯,而且最后,通過工具來完成其實是比較好的方式,但是必須讓工具變得優雅一些。 聲明:本文屬原創文章,始發于公號:程序員自學之道,同步發布到 sf,轉載請注明出處。 不夠好的方案 在 Web 開發中, 我們經常需要校驗各種參數,這是一件繁瑣又重要的事情,對于很多人來說,在做參...
摘要:多字節字符串假設字符串中的每一個字符都是八位字符,占用一個字節的內存。如果使用原生的字符串函數處理這些多字節字符串,會得到意外的錯誤。字符編碼一定要知道數據的字符編碼。擴展不僅可以處理字符串,還可以在不同的字符編碼之間轉換多字節字符串。 多字節字符串 1).PHP假設字符串中的每一個字符都是八位字符,占用一個字節的內存。但是,你有可能會遇到多字節字符串。2).這里所說的多字節字符串是指...
摘要:為可恢復的錯誤使用檢查型異常,為編程錯誤使用非檢查型錯誤。檢查型異常保證你對錯誤條件提供異常處理代碼,這是一種從語言到強制你編寫健壯的代碼的一種方式,但同時會引入大量雜亂的代碼并導致其不可讀。在編程中選擇檢查型異常還是運行時異常。 異常處理是Java 開發中的一個重要部分。它是關乎每個應用的一個非功能性需求,是為了處理任何錯誤狀況,比如資源不可訪問,非法輸入,空輸入等等。Java提供了...
閱讀 781·2021-11-09 09:47
閱讀 1568·2019-08-30 15:44
閱讀 1143·2019-08-26 13:46
閱讀 2107·2019-08-26 13:41
閱讀 1266·2019-08-26 13:32
閱讀 3772·2019-08-26 10:35
閱讀 3519·2019-08-23 17:16
閱讀 448·2019-08-23 17:07