錯誤是開發人員在編程時面對的最常見事件。錯誤可以歸類為句法,運行時或邏輯:語句結尾處缺少半隆是語法錯誤的示例;在服務器下降時嘗試連接到數據庫是運行時錯誤的一個示例;向變量提供錯誤的數據是邏輯錯誤的一個示例。為了幫助減少代碼中的錯誤次數並減輕其效果,在您的Web應用程序中必須進行適當的錯誤處理。
本文是PHP錯誤處理中的速成課程。您將了解PHP內置錯誤報告級別,以及如何使用自定義錯誤處理程序和異常處理來處理錯誤。
鑰匙要點
PHP錯誤處理對於維持Web應用程序的完整性和功能至關重要。它有助於識別和修復腳本執行期間可能出現的問題,從而通過控制發生錯誤時看到的內容來改善用戶體驗。
PHP提供了多個用於錯誤處理的內置功能,包括日誌記錄和顯示它們。它還提供了通過註冊錯誤處理程序和使用異常來自定義錯誤處理策略的靈活性。
可以使用set_error_handler()和set_exception_handler()函數來實現PHP中的自定義錯誤處理。這些允許開發人員定義自定義錯誤處理規則和異常,這對於記錄錯誤或發送錯誤通知可能很有用。
PHP中的- 例外是腳本執行過程中發生的事件,破壞了指令的正常流程。可以使用嘗試,捕捉並最終阻止它們來處理它們。如果在拋出異常時找不到捕獲塊,則PHP將顯示致命錯誤並停止執行腳本。
-
php錯誤報告級別-
所有錯誤和警告都應記錄。根據錯誤的嚴重性,應將通知發送給其他系統/團隊。為了更好地評估其嚴重性,PHP提供了幾個內置錯誤級別來描述錯誤的性質。每個級別都由整數值表示,並命名為常數,可以由程序員使用。下表取自官方的PHP文檔,並顯示了一些不同的級別。
-
可以將級別與位操作員一起掩蓋,以包括或從PHP的配置中減去它們。例如,e_all | e_strict通過添加e_strict啟用所有錯誤和警告(在5.4之前的PHP版本中必需)。
PHP提供了一些與記錄和顯示錯誤有關的配置指令。它們的價值通常取決於系統在開發還是生產環境中。該表顯示了一些與錯誤相關的指令。
可以在php.ini,Web服務器配置文件(httpd.conf或.htaccess文件)中設置配置指令,也可以使用ini_set()函數在腳本中在運行時設置。閱讀文檔以獲取有關指令以及如何/在何處設置它們的更多信息。
創建自定義錯誤處理程序
不向最終用戶顯示原始錯誤也是一個好習慣。顯示的錯誤應用友好的自定義錯誤消息抽象。 PHP不僅提供了用於記錄和顯示錯誤的內置功能,而且還提供了提高錯誤的功能。您可以使用trigger_error()務實觸發特定級別的錯誤。例如,此代碼會觸發e_user_notice警告,如果$ test的值大於1:
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
登入後複製
登入後複製
登入後複製
當您設有錯誤處理基礎架構時,使用TRIGGE_ERROR()觸發錯誤非常有用,從而使您可以統一處理自定義錯誤以及PHP提出的錯誤和警告。
如果要實現自定義錯誤處理策略,例如根據其嚴重性向數據庫發送電子郵件或記錄錯誤,則需要使用SET_ERROR_HANDLER()來定義自定義錯誤處理程序。該函數接受兩個參數:回調函數或靜態方法,該方法將在增加錯誤時被調用,並且(可選)錯誤級別函數/方法處理。回調的簽名是:
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
登入後複製
登入後複製
登入後複製
讓我們看一下自定義錯誤處理程序功能。下面的示例在遇到一個數據庫表數據庫中記錄錯誤:
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
登入後複製
登入後複製
登入後複製
上面的摘要註冊了一個錯誤處理程序,該處理程序執行以下操作:當出現非致命錯誤時,記錄將插入數據庫中,而不是顯示錯誤並將其記錄到文件中;當發生致命錯誤時,它將在數據庫中記錄並終止您的腳本。
但是,您應該注意的自定義錯誤處理程序有一些局限性。錯誤處理程序繞過PHP的標準錯誤處理行為,因此無法處理處理程序本身可能出現的錯誤。例如,如果數據庫服務器關閉,則上述功能將無法記錄日誌。此外,錯誤處理程序無法捕獲某些內部錯誤,例如e_core_error和e_compile_error,或同一文件中的e_strict錯誤,因為這些錯誤在處理程序有機會註冊之前發生。
使用異常來處理錯誤
無論您使用的錯誤處理框架如何,在運行時總會出現問題。當然,您不希望這些錯誤顯示在用戶的瀏覽器中。這是例外處理進入圖片的地方。異常使您可以優雅地處理錯誤和特殊情況。
php中的例外情況(或其任何子類)表示。可以使用擲球來抬起它們,並可以使用嘗試/捕獲塊捕獲。您可以擴展異常以創建自定義類型以捕獲特定錯誤。
可能觸發異常的代碼將放置在TRY塊中,並且要處理異常的代碼將其放置在捕獲塊中。考慮以下片段:
如果虛擬getDatafromService()方法拋出了例外,則將捕獲在捕獲塊中,並將顯示一條消息。如果GetDataFromService()成功執行,那麼該流將通過捕獲塊並繼續整個腳本的其餘部分。任何被拋出且未捕獲的例外都會產生e_fatal錯誤,並在“無人例外”中產生E_FATAL錯誤。
異常類提供了六種不同的方法來訪問有關引起問題的信息的信息,如下表所示。
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
登入後複製
登入後複製
登入後複製

創建自定義異常處理程序
PHP會讓您像一個例外一樣將任何對象扔掉,但是根據經驗,例外應擴展PHP的內置異常類。根據對象的類型,您可以以不同的方式處理異常。自定常處理可以執行合適的操作,例如文件中的記錄錯誤消息,提供有關通過檢查調用堆棧等發生的行的確切詳細信息。請查看此示例:
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
登入後複製
登入後複製
登入後複製
上面的代碼定義了兩種新的自定義類型,nameException
和EmailException,可用於指示不同的錯誤。然後在Try塊中,代碼檢查是否已為變量$ name和$ email提供了值。如果兩個是空的,則使用擲拋出適當的例外。執行相應的捕獲塊,以處理錯誤。
重新投入異常
嘗試/捕獲塊可以嵌套。有時,您需要捕獲異常,查看其某些屬性,然後再次將其扔掉以讓父母捕獲塊處理它。這通常對於檢查錯誤條件並確定是否應致命是有用的。此示例代碼演示了重新投入一個例外:
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
登入後複製
登入後複製
登入後複製
>未接收的異常處理程序
類似於SET_ERROR_HANDLER()允許您指定函數來處理運行時錯誤的方式類似,SET_EXECTION_HANDLER()函數允許您處理使其一直沿呼叫堆棧的異常處理而不會被任何捕獲塊捕獲。例如,如果異常使它一直沿您的堆棧上升,那麼最好將其記錄在日誌文件中。您可以創建一個回調函數,並在set_exception_handler()中註冊,如下示例所示。
<span><span><?php
</span></span><span><span>function errorHandler($errno, $errstr, $errfile, $errline) {
</span></span><span> <span>static $db;
</span></span><span> <span>if (empty($db)) {
</span></span><span> <span>$db = new PDO(DSN, DBUSER, DBPASS);
</span></span><span> <span>}
</span></span><span>
</span><span> <span>$query = "INSERT INTO errorlog (severity, message, filename, lineno, time) VALUES (?, ?, ?, ?, NOW())";
</span></span><span> <span>$stmt = $db->prepare($query);
</span></span><span>
</span><span> <span>switch ($errno) {
</span></span><span> <span>case E_NOTICE:
</span></span><span> <span>case E_USER_NOTICE:
</span></span><span> <span>case E_DEPRECATED:
</span></span><span> <span>case E_USER_DEPRECATED:
</span></span><span> <span>case E_STRICT:
</span></span><span> <span>$stmt->execute(array("NOTICE", $errstr, $errfile, $errline));
</span></span><span> <span>break;
</span></span><span>
</span><span> <span>case E_WARNING:
</span></span><span> <span>case E_USER_WARNING:
</span></span><span> <span>$stmt->execute(array("WARNING", $errstr, $errfile, $errline));
</span></span><span> <span>break;
</span></span><span>
</span><span> <span>case E_ERROR:
</span></span><span> <span>case E_USER_ERROR:
</span></span><span> <span>$stmt->execute(array("FATAL", $errstr, $errfile, $errline));
</span></span><span> <span>exit("FATAL error <span><span>$errstr</span> at <span>$errfile</span>:<span>$errline</span>"</span>);
</span></span><span>
</span><span> <span>default:
</span></span><span> <span>exit("Unknown error at <span><span>$errfile</span>:<span>$errline</span>"</span>);
</span></span><span> <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>set_error_handler("errorHandler");
</span></span><span>
</span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error("Value of <span><span>$test</span> must be 1 or less"</span>, E_USER_NOTICE);
</span></span><span><span>}</span></span>
登入後複製
摘要
PHP提供多種內置功能,用於處理錯誤條件,包括日誌記錄和顯示它們。它還為您提供了通過註冊錯誤處理程序和使用異常來自定義錯誤處理策略的靈活性。錯誤是生活的事實,但希望我在本文中提供的信息將幫助您更優雅地處理它們。
>圖像通過Ilya Andriyanov / shutterstock
>常見問題(常見問題解答)有關php
中錯誤處理的問題
>在PHP中處理錯誤的重要性是什麼?
> PHP中的錯誤處理對於維持Web應用程序的完整性和功能至關重要。它可以幫助開發人員識別並解決在執行腳本期間可能出現的問題。如果沒有適當的錯誤處理,次要問題可能會導致重大問題,例如崩潰應用程序或向用戶展示敏感信息。它還改善了用戶體驗,因為它允許開發人員控制發生錯誤時看到的內容,而不是顯示令人困惑的錯誤消息。
> PHP默認如何處理錯誤?
默認情況下,PHP將錯誤報告發送到服務器的錯誤日誌並在屏幕上顯示錯誤消息。對於實時網站而言,此行為不是理想的選擇,因為它可以向用戶揭示敏感信息。因此,建議更改現場網站的默認錯誤處理設置。
> php?
php中有哪些類型的錯誤將錯誤分類為多種類型,包括致命錯誤,警告,解析,解析錯誤和注意事項。致命錯誤是關鍵錯誤,例如調用不存在的功能或寫入不寫的文件。警告是允許腳本繼續運行的非致命錯誤。當腳本中存在語法錯誤時,就會發生解析錯誤。在執行腳本時,php會遇到的通知是次要錯誤或可能的錯誤。
如何自定義PHP中的錯誤處理?這些功能允許您定義自定義錯誤處理規則和異常。您可以指定一個自定義函數來處理錯誤,該功能對於記錄錯誤或發送錯誤通知很有用。
>
> php?
>的例外是一個例外情況,是在執行腳本中破壞腳本指令正常流程的腳本時發生的事件。當拋出異常時,PHP將停止執行腳本並開始尋找一個捕獲塊來處理異常。如果找不到捕獲塊,PHP將顯示致命的錯誤並停止執行腳本。
如何處理PHP?
PHP中的異常提供嘗試,捕捉,最後阻止以處理異常。嘗試塊包含可能引發異常的代碼。捕獲塊包含用於處理異常的代碼。最終塊包含將執行的代碼,無論是否引發異常。錯誤由PHP引擎處理,可以使用錯誤報告設置和自定義錯誤處理程序來控制。另一方面,例外是由腳本處理的,可以通過嘗試,捕獲,最後封鎖。 >
>如何關閉PHP中的錯誤報告?但是,關閉錯誤報告不建議用於實時網站,因為它可能會使很難識別和修復問題。 >
> @運算符在PHP錯誤處理中的作用是什麼? >
@ operator in php中的 @ operator用於抑制錯誤消息。當將PHP中的表達式添加到一個表達式中時,該表達式可能生成的任何錯誤消息都將被忽略。 >
>如何在PHP中記錄錯誤?
php提供error_log()函數以將錯誤消息發送到服務器的錯誤日誌或指定文件。此功能可用於跟踪錯誤和調試。您還可以通過更改php.ini文件中的log_errors指令來配置php以記錄所有錯誤。
以上是phpmaster | PHP中的錯誤處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!