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