錯誤和異常
錯誤
php程序自身的問題,一般是由非法的語法,環境問題導致
異常
一般是業務邏輯上出現的不合預期、與正常流程不同的狀況,不是語法錯誤
錯誤異常繼承關係
小括號表示php版本
php7下的常見錯誤異常類型
常見錯誤/異常代碼 | 類型 | try/catch | set_error_handler | set_exception_handler | register_shutdown_function(均觸發) |
---|---|---|---|---|---|
include/require "aaa" |
錯誤 | ❌ | ✔ | ❌ | |
undefined() |
異常 | ✔ | ❌ | ✔ | |
$arr=["a"=>1];echo $arr['b']; |
錯誤 | ❌ | ✔ | ❌ | |
echo 1/0; |
錯誤 | ❌ | ✔ | ❌ | |
intdiv(1,0) |
異常 | ✔ | ❌ | ✔ | |
define("A",1);define("A",1); |
錯誤 | ❌ | ✔ | ❌ | |
function a(); function a();//或者類的重複定義 |
錯誤 | ❌ | ❌ | ❌ | |
function add($a,$b){return $a+$b;} add(1); add(1,2,3);//自動忽略了多餘的 |
異常 | ✔ | ❌ | ✔ | |
$a=1; foreach ($a as $k=>$v){ echo $k."--".$v; } |
錯誤 | ❌ | ✔ | ❌ | |
include "parseError.php"; //parseError.php 有語法錯誤 |
異常 | ✔ | ❌ | ✔ | |
$a=null; $a->fun(); |
異常 | ✔ | ❌ | ✔ |
錯誤和異常的有關主要配置
log_errors //開啓記錄錯誤日誌
display_errors //是否在頁面展示錯誤日誌
error_reporting //錯誤級別
error_log
如果該配置沒有設置,則錯誤信息會被髮送到 SAPI 錯誤記錄器。
例如,出現nginx的錯誤日誌中,或者在CLI中發送到 stderr
配置優先級別fpm>ini>nginx
錯誤/異常有關處理函數
https://www.php.net/manual/zh/ref.errorfunc.php
set_exception_handler
在exception_handler 調用後異常會中止
只能設置1個,未設置則返回NULL,再次設置返回上次的handler(5.5+),設置爲NULL和restore_exception_handler()作用類似
set_error_handler
以下級別的錯誤不能由用戶定義的函數來處理,獨立於發生錯誤的地方: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 調用 set_error_handler() 函數所在文件中產生的大多數 E_STRICT
如果錯誤發生在腳本執行之前,將不會 調用自定義的錯誤處理程序因爲它尚未在那時註冊
傳入 null 重置處理程序到默認狀態,同restore_error_handler()
handler裏error_types 裏指定的錯誤類型都會繞過 PHP 標準錯誤處理程序, 除非回調函數返回了 false
如果handler返回 false,標準錯誤處理處理程序將會繼續調用
register_shutdown_function
不影響error_log的行爲,可以多個
Yii裏的異常和錯誤處理
- 出現錯誤-> 觸發->錯誤的處理handler->錯誤處理handler拋出異常-》觸發異常處理的hander->寫日誌/格式化輸出
- 出現異常->觸發異常處理的hander→寫日誌/格式化輸出
- 出現fatal錯誤→觸發 register_shutdown_function的handler->寫日誌/格式化輸出
常見的查錯
去哪找日誌,陌生的項目怎麼快速的找到日誌
1.去error_log文件找(php-fpm.conf→php.ini→nginx的error_log) 一定要注意日誌文件的權限(fpm 的worker進程是否可寫)
2.找set_exception_handler,set_error_handler的返回
不找日誌,重置錯誤處理
不想管自定義的錯誤處理
把錯誤,異常處理的handeler全部重置掉,只去標準裏去找即可
error_reporting(E_ALL);
ini_set("display_errors","On");
restore_exception_handler();
restore_error_handler();
常用調試
基本簡單的調試
var_dump(),print_r(),var_export()
Yii框架的幫助函數 比如 yii\helpers\VarDumper::dump/dumpAsString());
調用棧追蹤
1.debug_backtrace(int $options = DEBUG_BACKTRACE_IGNORE_ARGS, int $limit = 0)
調用到此處,調用鏈關係,根據需要傳需要的參數,節省開銷
2.get_included_files()
按順序打印加載文件的順序助於調試
比如常駐的(swoole,workerman)可以通過這個看,修改某個php文件(此處是不是已經加載到內存),用不用重啓服務
其它工具
Yii的debugger tool
爲了調試方便對其他人不產生影響,可使用種cookie方式開啓(外加ip白名單)方式,比較適合yii混編的頁面調試
輔助配套的cookie-editor插件
https://chrome.google.com/webstore/detail/cookie-editor/iphcomljdfghbkdcfndaijbokpgddeno?hl=zh-CN
whoops(類似yii debugger tool)
點擊左邊可以代碼到那裏
chrome控制檯
https://github.com/ccampbell/chromephp
頁面有刷新跳轉時 可以開啓console日誌保持模式