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