搜尋
首頁後端開發PHP7一起分析PHP7的錯誤和異常

一起分析PHP7的錯誤和異常

Oct 14, 2021 pm 04:44 PM
mysqlphp

推薦:《PHP7教學

PHP語言簡單的原因之一就是PHP的錯誤處理機制,隨著PHP語言越來越現代化,也出現了異常,這篇博文就是簡單說下錯誤和異常,以便系統的理解,另外對於任何一種語言來說,異常的存在是具備共性的,所以學習一門語言理解異常機制是必不可少的.

什麼是錯誤
當PHP語言遇到異常的情況(比如數據庫連接不上或函數參數傳遞錯誤),則會報出一些錯誤,錯誤可以分為多種類型,除了E_ERROR和E_CORE_ERROR錯誤,其它錯誤不會終止程序運行.
PHP讓人覺得簡單的原因就在於程式不會頻繁的報錯,給人一種編寫流暢和方便的錯覺.
也正因為這個原因PHP程式的嚴謹性和準確性差了不少,比如mysql_fetch_array查詢遇到網路錯誤回傳FALSE的時候(程式沒有終止運行),假如調用程式認為查詢沒有匹配的資料,則這個程式本質是錯誤的.
透過php.ini的指令error_reporting或動態調用error_reporting()函數我們可以選擇報告什麼類型的錯誤,透過display_errors指令則可以控制錯誤是否在線輸出.而error_log指令可以控制將錯誤輸出到日誌中.

如何正確使用錯誤
#不管是系統函數或是自訂函數,假如內部遇到錯誤,如何告之調用者呢?一般是透過函數回傳TRUE或FALSE來表示.這種處理方式有幾個弊端:
● 呼叫者只知道發生了錯誤,但是回傳的錯誤訊息太少,且缺乏錯誤類型的說明
● 程式處理邏輯和錯誤處理混雜在一塊,產生的程式碼會非常的不清晰.
一個小技巧: error_get_last()函數會傳回最近錯誤產生的具體原因.

最佳實踐:
● set_error_handler()函數來託管所有的錯誤
● trigger_error()函數可以觸發自訂錯誤,可以用來在函數中代替return 語句
● 將所有的錯誤輸出到日誌中,同時定義錯誤類型
● 對使用者顯示錯誤,例如將錯誤以一種更友善的方式傳回給使用者
● 生產環境下display_errors指令要關閉,開發環境則該指令開啟
老牌的PHP框架Codeigniter處理錯誤的方式可以藉用

`function _error_handler($severity, $message, $filepath, $line)
{
    $is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity);
    //输出500错误HTTP状态码
    if ($is_error) {
        set_status_header(500);
    }
    //对于不需要处理的错误则直接中断
    if (($severity & error_reporting()) !== $severity) {
        return;
    }
    //将所有的错误记录到日志中
    $_error =& load_class('Exceptions', 'core');
    $_error->log_exception($severity, $message, $filepath, $line);
    //友好的输出所有错误
    if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))){
        $_error->show_php_error($severity, $message, $filepath, $line);
    }
    //假如致命错误则直接退出
    if ($is_error) {
        exit(1);   
    }
}
set_error_handler('_error_handler');`

什麼是異常
#異常也是錯誤,它具備以下的特點:
● 異常可以自訂,SPL提供了很多類型的異常,你也可以擴展它
● 異常最常規的動作就是捕獲,這樣開發者就能根據具體的錯誤進行後續處理.例如可以根據異常的上下文給用戶返回友好的提示.或者繼續拋出一個異常,讓上游的程序去處理.假如還是沒有捕獲異常,那麼程序就直接終止了.
● 異常另外個動作就是拋出,假如透過函數編寫業務邏輯,遇到意外的情況,可以直接扔出一個異常.
● 異常可以被代碼一層一層捕獲,假如最外層的程序還沒有捕獲,則程式碼直接終止執行
● PHP中的異常假如不能捕獲,則作為致命錯誤寫入到系統錯誤日誌中
透過直覺的程式碼來說明下:

`function inverse($x)
{
    if ($x = 10 and $x =10 and xgetMessage(), "\n";
} catch (Exception $e) {
    echo 'Caught Exception: ', $e->getMessage(), "\n";
    throw $e;
}`

異常的最佳實踐
● 異常可以讓程式碼更加清晰,讓開發者專注於業務邏輯的編寫.
● 構建可擴展的異常是非常有技術性的,難道SPL異常還做的不夠嗎?
● 捕獲異常應該僅僅捕獲本層能處理的異常,對於不能處理的異常則讓上游的代碼處理.

PHP7中的異常##PHP7鼓勵使用異常來代替錯誤,但是不可能一下子推翻錯誤處理機制,需要兼容,所以只能慢慢過渡.
但是可以通過變通的方式來統一使用異常
● Error異常
PHP中定義了一個Error異常,注意這個異常和Exception是並列的,
當打開嚴格模式的時候,PHP7中很多的錯誤是被Error異常拋出的.這樣就能統一使用異常了.

`declare (strict_types = 1);
function add(int $a, int $b)
{
    return $a + $b;
}
try {
    echo add("3", "4");
}
catch (TypeError $e) { //TypeError继承自Error
    echo $e->getMessage();
}`
● ErrorException

ErrorException繼承自Exception.
我們可以透過set_error_handler()函數將所有的錯誤轉換成ErrorException.這樣就能愉快的統一使用異常了.
以上就是系統化理解PHP中的錯誤和異常的詳細內容,希望對你有幫助。
閱讀原文:系統化理解PHP中的錯誤與例外

以上是一起分析PHP7的錯誤和異常的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境