PHP7中的新機制捕獲錯誤E_PARSE和E_ERROR

發布時間:2019-06-12 23:04:21 來源:PHP官方 作者:青鋒建站
  PHP7改變了大多數錯誤的報告方式。不同于傳統(PHP5)的錯誤報告機制,現在大多數錯誤被作為 Error 異常拋出。 您可以通過捕獲(Throwable)捕獲異常和錯誤。Throwable在PHP5.x上不起作用。要捕獲PHP5.x和7中的異常和錯誤,請先為捕獲Throwable后的異常添加捕獲塊。一旦不再需要PHP5.x支持,就可以刪除塊捕獲異常。以下是青鋒建站給大家分享的PHP7中捕獲錯誤E_PARSE和E_ERROR的新機制。

PHP5與PHP7錯誤處理比較

  過去,在PHP5.x中處理致命錯誤幾乎是不可能的。致命錯誤不會調用SET_ERROR_HANDER()設置的錯誤處理程序,只會停止腳本執行。在PHP 7中,當發生致命和可恢復的錯誤(E_ERROR和E_Recovery_ERROR)時,將引發異常,而不是停止腳本的執行。某些情況下仍然存在致命錯誤,例如內存不足,并且仍然會像以前一樣立即停止腳本執行。在PHP 7中,一個未察覺的異常也將繼續是一個致命的錯誤。這意味著,如果從PHP5.x中的致命錯誤拋出的異常不存在,那么它仍然是PHP 7中的致命錯誤。
  從致命錯誤和可恢復錯誤引發的異常不會擴展異常。這種分離是為了防止現有的PHP5.x代碼捕獲用于停止腳本執行的錯誤引發的異常。從致命和可恢復錯誤引發的異常是新的和單獨的異常類的實例:Error。與任何其他異常一樣,錯誤可能會被捕獲和處理,并允許執行任何最終塊。

Zend引擎工作機制分析

1、php 在解釋運行用戶代碼時,會以主腳本為載入點,Zend Engine 首先對其進行語法解析(Parse),這里一定要理解,Zend Engine 此時是對腳本的語法進行解析,腳本中的任何 ini 設置都對其無效(還沒解釋載入執行初始化),所以你設置的什么 error_reporting, display_errors, set_error_handler。只有當語法解析無誤,Zend Engine 開始載入并解釋腳本,腳本里的一些參數設置項才會開始生效。
2、php 沒有 //鏈接依賴庫 -- 編譯 -- 運行// 一說。當 php 在主腳本中 “引入依賴” 時,Zend Engine 并不會在對主腳本做語法解析時將其 “依賴” 也載入解析。Zend Engine 只會對當前的主腳本做語法解析,在解析通過后,便開始解釋執行用戶代碼,即便 “依賴” 中有 Parse Error,那也得等到真的執行到載入命令時才會加載解析-解釋-運行。
  結論:error_reporting, display_errors, set_error_handler對當前腳本無效,對加載進來的腳本生效;為了正確使用PHP7中的捕獲錯誤的機制,需要將大部腳本代碼放入其他文件進行引入,而在主腳本中定義捕獲機制來完成對E_PARSE和E_ERROR錯誤的捕獲。

PHP7捕獲異常和錯誤

  這種 Error 異常可以像 Exception 異常一樣被第一個匹配的 try / catch 塊所捕獲。如果沒有匹配的 catch 塊,則調用異常處理函數(事先通過 set_exception_handler() 注冊)進行處理。 如果尚未注冊異常處理函數,則按照傳統方式處理:被報告為一個致命錯誤(Fatal Error)。
  Error 類并非繼承自 Exception 類,所以不能用 catch (Exception $e) { ... } 來捕獲 Error。你可以用 catch (Error $e) { ... },或者通過注冊異常處理函數( set_exception_handler())來捕獲 Error。
try
{
   // Code that may throw an Exception or Error.
}
catch (Throwable $t)
{
   // Executed only in PHP 7, will not match in PHP 5
}
catch (Exception $e)
{
   // Executed only in PHP 5, will not be reached in PHP 7
}

PHP5錯誤處理機制

  PHP5我們一般通過set_error_handler自定義錯誤處理函數來進行錯誤處理。
set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
設置用戶的函數 (error_handler) 來處理腳本中出現的錯誤。
  本函數可以用你自己定義的方式來處理運行中的錯誤, 例如,在應用程序中嚴重錯誤發生時,或者在特定條件下觸發了一個錯誤(使用 trigger_error()),你需要對數據/文件做清理回收。
  重要的是要記住 error_types 里指定的錯誤類型都會繞過 PHP 標準錯誤處理程序, 除非回調函數返回了 FALSE。 error_reporting() 設置將不會起到作用而你的錯誤處理函數繼續會被調用 —— 不過你仍然可以獲取 error_reporting 的當前值,并做適當處理。 需要特別注意的是帶 @ error-control operator 前綴的語句發生錯誤時,這個值會是 0。
  同時注意,在需要時你有責任使用 die()。 如果錯誤處理程序返回了,腳本將會繼續執行發生錯誤的后一行。
  以下級別的錯誤不能由用戶定義的函數來處理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 調用    set_error_handler() 函數所在文件中產生的大多數 E_STRICT。
  如果錯誤發生在腳本執行之前(比如文件上傳時),將不會 調用自定義的錯誤處理程序因為它尚未在那時注冊。
  以上就是青鋒建站給大家分享的PHP7中捕獲錯誤的新錯誤處理機制工作過程。青鋒建站,提供專業的高品質網站制作服務,包括PHP網站建設,SEO,網絡營銷,PHP軟件開發,專業做優化型網站,為企業構建營銷平臺。
分享到:

Copyright © 2016-2026 青鋒建站 版權所有

超级狮子电子游艺