php try报错程序中断,php7异常与错误处理和自定义异常
7.2版本異常與錯(cuò)誤的概述
什么叫做異常?
異常是指程序運(yùn)行中不符合預(yù)期情況以及與正常流程不同的狀況。
比如你鏈接數(shù)據(jù)庫,在參數(shù)都寫上去的條件下,發(fā)現(xiàn)鏈接不上去,這就屬于不符合預(yù)期。
可以被 try-catch 捕捉得到
什么叫做錯(cuò)誤?
是屬于php程序自身的問題,一般是由非法的語法,環(huán)境問題導(dǎo)致的,使得編譯器無法通過檢查,甚至無法運(yùn)行的情況。
平時(shí)遇到的 warming、notice都是錯(cuò)誤,只是級別不同而已。
例如:TypeError(類型錯(cuò)誤) 我規(guī)定的函數(shù)參數(shù)類型和傳入的參數(shù)不一致
ArithmeticError (算數(shù)錯(cuò)誤)
ParseError (解析錯(cuò)誤)在調(diào)入的文件中,include "demo.php",或者 eval();中有語法錯(cuò)誤造成解析失敗
AssertionError(斷言錯(cuò)誤)當(dāng)assert生效時(shí)產(chǎn)生該錯(cuò)誤
DivisionByZeroError (分母為零) 運(yùn)算過程中例如除法,分母為0
除了這幾種情況,其余全部為異常
異常處理
在以前的 php5.X 中 并且不能被 try-catch 捕捉得到,到了 php 7.x 中,定義了一個(gè) Throwable 接口 并使得大部分的 Error 和Exception 實(shí)現(xiàn)了該接口,我們得以在 try-catch 中拋出該錯(cuò)誤。
所以說以后想要捕獲異常,而你又不知道此異常是 Error 還是 Exception 的話,可以向這樣拋出
try{……}catch(Throwable $e){……}
錯(cuò)誤的級別
在 php 中的錯(cuò)誤也是有級別的
Parse error >Fatal Error > Waning > Notice > Deprecated
Deprecated 最低級別的錯(cuò)誤(不推薦,不建議)使用一些過期函數(shù)的時(shí)候會(huì)出現(xiàn),程序繼續(xù)執(zhí)行Notice 通知級別的錯(cuò)誤使用一些未定義變量、常量或者數(shù)組key沒有加引號的時(shí)候會(huì)出現(xiàn),程序繼續(xù)執(zhí)行E_NOTICE // 運(yùn)行時(shí)通知。表示腳本遇到可能會(huì)表現(xiàn)為錯(cuò)誤的情況.E_USER_NOTICE // 用戶產(chǎn)生的通知信息。Waning 警告級別的錯(cuò)誤程序出問題了,需要修改代碼!!!程序繼續(xù)執(zhí)行E_WARNING // 運(yùn)行時(shí)警告 (非致命錯(cuò)誤)。E_CORE_WARNING // PHP初始化啟動(dòng)過程中發(fā)生的警告 (非致命錯(cuò)誤) 。E_COMPILE_WARNING // 編譯警告E_USER_WARNING // 用戶產(chǎn)生的警告信息Fatal Error 錯(cuò)誤級別的錯(cuò)誤程序直接報(bào)錯(cuò),需要修改代碼!!!中斷程序執(zhí)行,可使用register_shutdown_function()函數(shù)在程序終止前觸發(fā)一個(gè)函數(shù)E_ERROR // 致命的運(yùn)行錯(cuò)誤,錯(cuò)誤無法恢復(fù),暫停執(zhí)行腳本E_CORE_ERROR // PHP啟動(dòng)時(shí)初始化過程中的致命錯(cuò)誤E_COMPILE_ERROR // 編譯時(shí)致命性錯(cuò),就像由Zend腳本引擎生成了一個(gè)E_ERRORE_USER_ERROR // 自定義錯(cuò)誤消息。像用PHP函數(shù)trigger_error(錯(cuò)誤類型設(shè)置為:E_USER_ERROR)Parse error 語法解析錯(cuò)誤語法檢查階段報(bào)錯(cuò),需要修改代碼!!!中斷程序執(zhí)行,除了修改ini文件,將錯(cuò)誤信息寫到日志中,什么也做不了E_PARSE //編譯時(shí)的語法解析錯(cuò)誤
自定義錯(cuò)誤處理程序
有的時(shí)候,php 中自帶的錯(cuò)誤處理程序,并不能完全滿足我們得需要,大部分時(shí)候,我們都需要手動(dòng)重寫異常處理。
php 給我們提供了三個(gè)函數(shù)來幫助我們來處理,分別是
set_error_handler()函數(shù)來托管錯(cuò)誤處理程序,可自行定制錯(cuò)誤的處理流程。
如果此函數(shù)之前的代碼發(fā)生錯(cuò)誤,那么不會(huì)調(diào)用我們自定義的處理函數(shù),因?yàn)檫€未注冊
設(shè)置此函數(shù)后 error_reporting() 將會(huì)失效
以下級別的錯(cuò)誤不能由用戶定義的函數(shù)來處理:E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 該函數(shù)只能捕捉我們的 部分 Warning 和 Note 級別的錯(cuò)誤
set_exception_handler()用于沒有被捕獲的異常處理
register_shutdown_function()作用:注冊一個(gè)會(huì)在php中止時(shí)執(zhí)行的函數(shù)
捕獲PHP的錯(cuò)誤:Fatal Error、Parse Error等,這個(gè)方法是PHP腳本執(zhí)行結(jié)束前最后一個(gè)調(diào)用的函數(shù),比如腳本錯(cuò)誤、die()、exit、異常、正常結(jié)束都會(huì)調(diào)用,
如果拿來用錯(cuò)誤處理的時(shí)候,需要配合error_get_last() 它能獲取最后發(fā)生的錯(cuò)誤。
// 舉例:register_shutdown_function('shutdown');function shutdown(){if ($error = error_get_last()) {var_dump($error);}}$name //沒寫 ; 號
執(zhí)行結(jié)果Parse error: syntax error, unexpected ';' in /app/swoole/errorDemo.php on line 34
Emmmmm 這不扯淡嗎?分明分明沒有執(zhí)行呢?
其實(shí)原因使因?yàn)?#xff0c;程序執(zhí)行前,我們 php 會(huì)先檢查我們程序的語法問題,如果沒有問題,我們才能執(zhí)行我們的程序。
我們上面的代碼沒用通過我們的語法檢查,所以直接報(bào)錯(cuò)。
那么問題來了?我們在框架中的時(shí)候,為什么是框架都是框架給我們報(bào)錯(cuò)呢?
框架的錯(cuò)誤處理
在框架中,其代碼是通過一個(gè)入口文件來加載的。而我們php檢測語法錯(cuò)誤的時(shí)候,只檢查我們的 index.php 有沒有錯(cuò)誤, require 文件中的代碼是不會(huì)受到檢測的。在Index.php 文件中通常會(huì)定義一些錯(cuò)誤異常的處理。當(dāng)我們代碼出錯(cuò)時(shí),那是在 run-time 中檢測的錯(cuò)誤,我們的框架可以根據(jù)我們編寫的錯(cuò)誤異常自行做出處理。
下面我們舉個(gè)例子 在 ThinkPHP5中的異常處理
// [ 應(yīng)用入口文件 ] index.phpnamespace think;// 加載基礎(chǔ)文件require __DIR__ . '/../thinkphp/base.php';// 支持事先使用靜態(tài)方法設(shè)置Request對象和Config對象// 執(zhí)行應(yīng)用并響應(yīng)Container::get('app')->run()->send();
在我們的入口文件中,加載了 base.php 在這個(gè)文件中,TP 定義了自己的異常處理
// 載入Loader類require __DIR__ . '/library/think/Loader.php';// 注冊自動(dòng)加載Loader::register();// 注冊錯(cuò)誤和異常處理機(jī)制Error::register();// 實(shí)現(xiàn)日志接口if (interface_exists('Psr\Log\LoggerInterface')) {//doSomething}// 注冊類庫別名Loader::addClassAlias([//doSomething]);/*** 注冊異常處理* @access public* @return void*/public static function register(){error_reporting(E_ALL);set_error_handler([__CLASS__, 'appError']);set_exception_handler([__CLASS__, 'appException']);register_shutdown_function([__CLASS__, 'appShutdown']);}
可以看到 TP是在入口腳本就注冊了 異常處理機(jī)制,分別把 Error 、Exception、Shutdown的處理都注冊進(jìn)來。后序所有的異常都不會(huì)走PHP原本的異常而是走 TP 自定義的異常。
來源:https://segmentfault.com/a/1190000020172875宜歲月崢嶸
不忘初心
不求上進(jìn)
總結(jié)
以上是生活随笔為你收集整理的php try报错程序中断,php7异常与错误处理和自定义异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle书评,【书评:Oracle查
- 下一篇: pe怎么破解开机密码 如何解除PE系统开