您好,登錄后才能下訂單哦!
這篇文章給大家分享的是PHP的異常與錯(cuò)誤處理。小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí)。如下資料是關(guān)于設(shè)置環(huán)境變量的內(nèi)容。
異常和錯(cuò)誤
示例:
$num = 0; try { echo 1/$num; } catch (Exception $e){ echo $e->getMessage();//并不能執(zhí)行到這里 } //說明try{}catch{}是用于捕獲異常的,而錯(cuò)誤是不能捕獲到的。 //手動(dòng)拋出異常進(jìn)行捕獲 $num = 0; try { if($num == 0){ //通過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ò)誤,而不是編譯或者語法上的錯(cuò)誤。
什么是錯(cuò)誤
屬于 php 腳本自身的問題,大部分情況是由錯(cuò)誤的語法,服務(wù)器環(huán)境導(dǎo)致,使得編譯器無法通過檢查,甚至無法運(yùn)行的情況。warning、notice 都是錯(cuò)誤,只是他們的級(jí)別不同而已,并且錯(cuò)誤是不能被 try-catch 捕獲的
錯(cuò)誤的分類
Fatal Error: 致命錯(cuò)誤(腳本終止運(yùn)行)
E_ERROR // 致命的運(yùn)行錯(cuò)誤,錯(cuò)誤無法恢復(fù),暫停執(zhí)行腳本
E_CORE_ERROR // PHP 啟動(dòng)時(shí)初始化過程中的致命錯(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ò)誤,語法錯(cuò)誤(腳本終止運(yùn)行)
E_PARSE // 編譯時(shí)的語法解析錯(cuò)誤
Warning Error:警告錯(cuò)誤(僅給出提示信息,腳本不終止運(yùn)行)
E_WARNING // 運(yùn)行時(shí)警告 (非致命錯(cuò)誤)。
E_CORE_WARNING // PHP 初始化啟動(dòng)過程中發(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){} 捕獲異常的方式,來捕獲錯(cuò)誤,需借助三個(gè)函數(shù)
// 注冊(cè)一個(gè)會(huì)在php中止時(shí)執(zhí)行的函數(shù) register_shutdown_function('myShutdownFunction'); function myShutdownFunction() { if ($error = error_get_last()) { var_dump('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>'); } }
//注冊(cè)異常處理函數(shù), 沒有捕獲處理的異常,將統(tǒng)一再這里處理 set_exception_handler('myException'); function myException($exception) { var_dump("<b>set_exception_handler: Exception: " . $exception->getMessage() . '</b>'); }
//注冊(cè)錯(cuò)誤處理函數(shù) set_error_handler('myError'); function myError($type, $message, $file, $line) { //var_dump('<b>set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .</b><br />'); 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)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。