十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
本篇內(nèi)容介紹了“PHP7中的錯(cuò)誤和異常有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

10年積累的網(wǎng)站制作、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有延安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
PHP語(yǔ)言簡(jiǎn)單的原因之一就是PHP的錯(cuò)誤處理機(jī)制,隨著PHP語(yǔ)言越來(lái)越現(xiàn)代化,也出現(xiàn)了異常,這篇博文就是簡(jiǎn)單說(shuō)下錯(cuò)誤和異常,以便系統(tǒng)的理解,另外對(duì)于任何一種語(yǔ)言來(lái)說(shuō),異常的存在是具備共性的,所以學(xué)習(xí)一門(mén)語(yǔ)言理解異常機(jī)制是必不可少的.
什么是錯(cuò)誤
當(dāng)PHP語(yǔ)言遇到異常的情況(比如數(shù)據(jù)庫(kù)連接不上或者函數(shù)參數(shù)傳遞錯(cuò)誤),則會(huì)報(bào)出一些錯(cuò)誤,錯(cuò)誤可以分為多種類型,除了E_ERROR和E_CORE_ERROR錯(cuò)誤,其它錯(cuò)誤不會(huì)終止程序運(yùn)行.
PHP讓人覺(jué)得簡(jiǎn)單的原因就在于程序不會(huì)頻繁的報(bào)錯(cuò),給人一種編寫(xiě)流暢和方便的錯(cuò)覺(jué).
也正因?yàn)檫@個(gè)原因PHP程序的嚴(yán)謹(jǐn)性和準(zhǔn)確性差了不少,比如MySQL_fetch_array查詢遇到網(wǎng)絡(luò)錯(cuò)誤返回FALSE的時(shí)候(程序沒(méi)有終止運(yùn)行),假如調(diào)用程序認(rèn)為查詢沒(méi)有匹配的數(shù)據(jù),則這個(gè)程序本質(zhì)是錯(cuò)誤的.
通過(guò) php.ini的指令 error_reporting或者動(dòng)態(tài)調(diào)用 error_reporting()函數(shù)我們可以選擇報(bào)告什么類型的錯(cuò)誤,通過(guò) display_errors指令則可以控制錯(cuò)誤是否在線輸出.而 error_log指令可以控制將錯(cuò)誤輸出到日志中.
如何正確使用錯(cuò)誤
不管是系統(tǒng)函數(shù)或者是自定義函數(shù),假如內(nèi)部遇到錯(cuò)誤,如何告之調(diào)用者呢?一般是通過(guò)函數(shù)返回 TRUE或者 FALSE來(lái)表明.這種處理方式有幾個(gè)弊端:
● 調(diào)用者只知道發(fā)生了錯(cuò)誤,但是返回的錯(cuò)誤信息太少,且缺乏錯(cuò)誤類型的說(shuō)明
● 程序處理邏輯和錯(cuò)誤處理混雜在一塊,產(chǎn)生的代碼會(huì)非常的不清晰.
一個(gè)小技巧: error_get_last()函數(shù)會(huì)返回最近錯(cuò)誤產(chǎn)生的具體原因.
最佳實(shí)踐:
● set_error_handler()函數(shù)來(lái)托管所有的錯(cuò)誤
● trigger_error()函數(shù)可以觸發(fā)自定義錯(cuò)誤,可以用來(lái)在函數(shù)中代替 return 語(yǔ)句
● 將所有的錯(cuò)誤輸出到日志中,同時(shí)定義錯(cuò)誤類型
● 對(duì)用戶顯示錯(cuò)誤,比如將錯(cuò)誤以一種更友好的方式返回給用戶
● 生產(chǎn)環(huán)境下 display_errors指令要關(guān)閉,開(kāi)發(fā)環(huán)境則該指令打開(kāi)
老牌的PHP框架 Codeigniter處理錯(cuò)誤的方式可以借鑒
`function _error_handler($severity, $message, $filepath, $line)
{
$is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity);
//輸出500錯(cuò)誤HTTP狀態(tài)碼
if ($is_error) {
set_status_header(500);
}
//對(duì)于不需要處理的錯(cuò)誤則直接中斷
if (($severity & error_reporting()) !== $severity) {
return;
}
//將所有的錯(cuò)誤記錄到日志中
$_error =& load_class('Exceptions', 'core');
$_error->log_exception($severity, $message, $filepath, $line);
//友好的輸出所有錯(cuò)誤
if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))){
$_error->show_php_error($severity, $message, $filepath, $line);
}
//假如致命錯(cuò)誤則直接退出
if ($is_error) {
exit(1);
}
}
set_error_handler('_error_handler');`什么是異常
異常也是一個(gè)錯(cuò)誤,它具備以下的特點(diǎn):
● 異常可以自定義,SPL提供了很多類型的異常,你也可以擴(kuò)展它
● 異常最常規(guī)的動(dòng)作就是捕獲,這樣開(kāi)發(fā)者就能根據(jù)具體的錯(cuò)誤進(jìn)行后續(xù)處理.比如可以根據(jù)異常的上下文給用戶返回友好的提示.或者繼續(xù)拋出一個(gè)異常,讓上游的程序去處理.假如還是沒(méi)有捕獲異常,那么程序就直接終止了.
● 異常另外個(gè)動(dòng)作就是拋出,假如通過(guò)函數(shù)編寫(xiě)業(yè)務(wù)邏輯,遇到意外的情況,可以直接扔出一個(gè)異常.
● 異??梢员淮a一層一層捕獲,假如最外層的程序還沒(méi)有捕獲,則代碼直接終止運(yùn)行
● PHP中的異常假如不能捕獲,則作為致命錯(cuò)誤寫(xiě)入到系統(tǒng)錯(cuò)誤日志中
通過(guò)直觀的代碼來(lái)說(shuō)明下:
`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;
}`異常的最佳實(shí)踐
● 異??梢宰尨a更加清晰,讓開(kāi)發(fā)者專注于業(yè)務(wù)邏輯的編寫(xiě).
● 構(gòu)建可擴(kuò)展的異常是非常有技術(shù)性的,難道SPL異常還做的不夠嗎?
● 捕獲異常應(yīng)該僅僅捕獲本層能處理的異常,對(duì)于不能處理的異常則讓上游的代碼處理.
PHP7中的異常
PHP7鼓勵(lì)使用異常來(lái)代替錯(cuò)誤,但是不可能一下子推翻錯(cuò)誤處理機(jī)制,需要兼容,所以只能慢慢過(guò)渡.
但是可以通過(guò)變通的方式來(lái)統(tǒng)一使用異常
● Error異常
PHP中定義了一個(gè) Error異常,注意這個(gè)異常和 Exception是并列的,
當(dāng)打開(kāi)嚴(yán)格模式的時(shí)候,PHP7中很多的錯(cuò)誤是被 Error異常拋出的.這樣就能統(tǒng)一使用異常了.
`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
ErrorException繼承自 Exception.
我們可以通過(guò) set_error_handler()函數(shù)將所有的錯(cuò)誤轉(zhuǎn)換成 ErrorException.這樣就能愉快的統(tǒng)一使用異常了.
“PHP7中的錯(cuò)誤和異常有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!