這篇文章給大家分享的是PHP的異常與錯(cuò)誤處理。小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí)。如下資料是關(guān)于設(shè)置環(huán)境變量的內(nèi)容。
創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)遷西,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220異常和錯(cuò)誤
示例:
$num = 0; try { echo 1/$num; } catch (Exception $e){ echo $e->getMessage();//并不能執(zhí)行到這里 } //說(shuō)明try{}catch{}是用于捕獲異常的,而錯(cuò)誤是不能捕獲到的。 //手動(dòng)拋出異常進(jìn)行捕獲 $num = 0; try { if($num == 0){ //通過(guò)if判斷可以處理錯(cuò)誤,手動(dòng)拋出異常(如何實(shí)現(xiàn)自動(dòng)捕獲錯(cuò)誤呢,需結(jié)合三個(gè)php內(nèi)置函數(shù)) throw new Exception('除數(shù)為零'); } echo 1/$num; } catch (Exception $e){ echo $e->getMessage(); }
什么是異常
程序在運(yùn)行中出現(xiàn)不符合預(yù)期的情況,允許發(fā)生(你也不想讓他出現(xiàn)不正常的情況)但他是一種不正常的情況,按照我們的正常邏輯本不該出的錯(cuò)誤,但仍然會(huì)出現(xiàn)的錯(cuò)誤,屬于邏輯和業(yè)務(wù)流程的錯(cuò)誤,而不是編譯或者語(yǔ)法上的錯(cuò)誤。
什么是錯(cuò)誤
屬于 php 腳本自身的問(wèn)題,大部分情況是由錯(cuò)誤的語(yǔ)法,服務(wù)器環(huán)境導(dǎo)致,使得編譯器無(wú)法通過(guò)檢查,甚至無(wú)法運(yùn)行的情況。warning、notice 都是錯(cuò)誤,只是他們的級(jí)別不同而已,并且錯(cuò)誤是不能被 try-catch 捕獲的
錯(cuò)誤的分類
Fatal Error: 致命錯(cuò)誤(腳本終止運(yùn)行)
E_ERROR // 致命的運(yùn)行錯(cuò)誤,錯(cuò)誤無(wú)法恢復(fù),暫停執(zhí)行腳本
E_CORE_ERROR // PHP 啟動(dòng)時(shí)初始化過(guò)程中的致命錯(cuò)誤
E_COMPILE_ERROR // 編譯時(shí)致命性錯(cuò),就像由 Zend 腳本引擎生成了一個(gè) E_ERROR
E_USER_ERROR // 自定義錯(cuò)誤消息。像用 PHP 函數(shù) trigger_error(錯(cuò)誤類型設(shè)置為:E_USER_ERROR)
Parse Error:編譯時(shí)解析錯(cuò)誤,語(yǔ)法錯(cuò)誤(腳本終止運(yùn)行)
E_PARSE // 編譯時(shí)的語(yǔ)法解析錯(cuò)誤
Warning Error:警告錯(cuò)誤(僅給出提示信息,腳本不終止運(yùn)行)
E_WARNING // 運(yùn)行時(shí)警告 (非致命錯(cuò)誤)。
E_CORE_WARNING // PHP 初始化啟動(dòng)過(guò)程中發(fā)生的警告 (非致命錯(cuò)誤) 。
E_COMPILE_WARNING // 編譯警告
E_USER_WARNING // 用戶產(chǎn)生的警告信息
Notice Error:通知錯(cuò)誤(僅給出通知信息,腳本不終止運(yùn)行)
E_NOTICE // 運(yùn)行時(shí)通知。表示腳本遇到可能會(huì)表現(xiàn)為錯(cuò)誤的情況.
E_USER_NOTICE // 用戶產(chǎn)生的通知信息。
5 類是產(chǎn)生 ERROR 級(jí)別的錯(cuò)誤,這種錯(cuò)誤直接導(dǎo)致 PHP 程序退出。分別是 ERROR = E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_PARSE
如何實(shí)現(xiàn)捕獲錯(cuò)誤
實(shí)現(xiàn)用 try {} catch (Exception $e){} 捕獲異常的方式,來(lái)捕獲錯(cuò)誤,需借助三個(gè)函數(shù)
// 注冊(cè)一個(gè)會(huì)在php中止時(shí)執(zhí)行的函數(shù) register_shutdown_function('myShutdownFunction'); function myShutdownFunction() { if ($error = error_get_last()) { var_dump('register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . ''); } }
//注冊(cè)異常處理函數(shù), 沒有捕獲處理的異常,將統(tǒng)一再這里處理 set_exception_handler('myException'); function myException($exception) { var_dump("set_exception_handler: Exception: " . $exception->getMessage() . ''); }
//注冊(cè)錯(cuò)誤處理函數(shù) set_error_handler('myError'); function myError($type, $message, $file, $line) { //var_dump('set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .
'); throw new Exception($message); }
捕獲所有錯(cuò)誤的原理
由 set_error_handler () 可知,他能夠捕獲一部分錯(cuò)誤,不能捕獲系統(tǒng)級(jí) E_ERROR、E_PARSE 等錯(cuò)誤,但是這部分可以由 register_shutdown_function () 捕獲。所以兩者結(jié)合能出現(xiàn)很好的功能。
小結(jié)
三個(gè)函數(shù)實(shí)現(xiàn)自動(dòng)捕獲異常和錯(cuò)誤
set_error_handler () 只能夠捕獲部分錯(cuò)誤
register_shutdown_function () 結(jié)合 set_error_handler () 函數(shù),能捕獲所有錯(cuò)誤
set_exception_handler () 用于捕獲異常
error_get_last () 最后終止錯(cuò)誤信息
在捕獲錯(cuò)誤的函數(shù)中,再手動(dòng)拋出異常,即實(shí)現(xiàn) set_exception_handler 能夠捕獲錯(cuò)誤。
如果你能讀到這里,恭喜你已經(jīng)對(duì)PHP的異常與錯(cuò)誤處理有了從實(shí)踐層面最深刻的體會(huì)了。如果想閱讀更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。