PHP 錯誤機制

錯誤級別

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()
程序繼續執行
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章