錯誤級別
PHP中總共設置了 16種錯誤級別,常見的有下面幾種:
E_ALL
包含所有的錯誤級別
E_ERROR
這種級別的錯誤會顯示 Fatal Error,是最嚴重的錯誤級別。產生這種錯誤後,程序將不會繼續執行。比如調用了不存在的函數,就會產生這種錯誤。
Fatal error: Uncaught Error: Call to undefined function sad() in C:\Myenv\apache\htdocs\basic\test.php on line 19
sad();
E_WARNING
警告級別的錯誤嚴重程度稍輕,不會終止腳本,程序將會繼續進行。顯示的錯誤信息是Warning。比如 include的文件不存在,將會產生這種錯誤。
( ! ) Warning: include(aa.php): failed to open stream: No such file or directory in C:\Myenv\apache\htdocs\basic\test.php on line 19
include('aa.php');
E_NOTICE
這種錯誤程度更爲輕微一些,提示你代碼中書寫不當的地方。這個錯誤的代碼可能在其他地方沒有問題,只是在當前上下文情況下出現了問題。比如說使用了一個之前未定義過的變量時,會產生這種錯誤。
Notice: Undefined variable: var in C:\Myenv\apache\htdocs\basic\test.php on line 19
echo $var;
E_DEPRECATED
產生錯誤說明在你使用了一箇舊版本的函數,而這個函數後期版本可能被禁用或者不維護了。程序還是可以正常運行的。比如說在 PHP7中使用了 mysql_擴展函數,就會產生這種錯誤。
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED,
這幾個錯誤級別是用戶觸發的錯誤。這就使得我們可以手動觸發 Fatal error、Warning、Notice、Deprecated 錯誤了。
Fatal error: This is a fatal error in C:\Myenv\apache\htdocs\basic\test.php on line 19
trigger_error('This is a fatal error!', E_USER_ERROR);
E_PARSE
上述的幾個錯誤都是 run-time型錯誤,也就是運行時產生的錯誤。而 E_PARSE級別的錯誤是在 PHP引擎對 PHP代碼進行語法檢查時發生的錯誤。發生這種錯誤時,代碼就不會被執行。少寫分號就會產生這種錯誤。
Parse error: syntax error, unexpected 'echo' (T_ECHO), expecting ',' or ';' in C:\Myenv\apache\htdocs\basic\test.php on line 20
echo 1
echo 2;
相關配置
error_reporting = E_ALL // 報告什麼級別的錯誤。相當於告訴 PHP我們關心什麼類型的錯誤,其他類型的錯誤統統忽略,什麼都不做
log_errors = On // 是否將錯誤記錄到錯誤日誌
log_errors_max_len = 1024 // 錯誤日誌的最大長度
error_log = /tmp/php_errors.log // 錯誤日誌保存的路徑
display_errors = On // 是否把錯誤展示在輸出上,這個輸出可能是頁面,也可能是stdout
display_startup_errors = On // 顯示是否把 PHP啓動過程的錯誤信息。
ignore_repeated_errors = Off // 是否忽略重複的錯誤
track_errors = Off // 是否使用全局變量 $php_errormsg來記錄最後一個錯誤
xmlrpc_errors = 0 //是否使用XML-RPC的錯誤信息格式記錄錯誤
xmlrpc_error_number = 0 // 用作 XML-RPC faultCode 元素的值。
html_errors = On // 是否把輸出中的函數等信息變爲HTML鏈接
docref_root = http://manual/en/ // 如果html_errors開啓了,這個鏈接的根路徑是什麼
fastcgi.logging = 0 // 是否把php錯誤拋出到fastcgi中
以處理異常的方式處理錯誤
在PHP7中,大多數錯誤可以像 Exception 異常一樣被第一個匹配的 try / catch 塊所捕獲。如果沒有匹配的 catch 塊,則調用異常處理函數(事先通過 set_exception_handler() 註冊)進行處理。 如果尚未註冊異常處理函數,則按照傳統方式處理,即報告爲一個致命錯誤(Fatal Error)。
層次結構:
◦ Throwable
◦ Error
◦ ArithmeticError
◦ DivisionByZeroError
◦ AssertionError
◦ ParseError
◦ TypeError
◦ Exception
◦ …
可以看到 Error 類並非繼承自 Exception 類,所以不能用 catch (Exception $e) { … } 來捕獲 Error。你可以用 catch (Error $e) { … },或者通過註冊異常處理函數( set_exception_handler())來捕獲 Error。
這種方式處理錯誤的好處是,比如遇到了 Fatal Error,程序就不會終止了,而且可以非常自由地定義錯誤顯示與處理方式。
<?php
try{
sad();
} catch (Throwable $e) {
echo $e->getMessage();
}
echo '程序繼續執行';
?>
結果:
/*
Call to undefined function sad()
程序繼續執行
*/