PHP 錯誤處理(new Exception、new Error、trigger_error、error_log )

不記起來會忘記,雖然記起來會混亂,寫個筆記紀錄一下

本文將介紹如何觸發錯誤、錯誤級別介紹、處理錯誤、錯誤日誌的寫法。

觸發錯誤

使用 Exception 類別

這種方式用於例外處理,當你想捕捉並處理某些條件下的錯誤時,可以拋出一個例外。這通常用於邏輯錯誤或應用程式級別的錯誤。

使用 Error 類別

Error 類別是從 PHP 7 開始引入的,用於處理更底層的錯誤,例如語法錯誤或類型錯誤。這些錯誤通常表示程式碼中的嚴重問題,應該被捕捉並記錄。

使用 trigger_error 函數

trigger_error 函數允許你生成一個用戶定義的錯誤。這對於在開發過程中發出警告或錯誤訊息非常有用。你可以指定錯誤等級,例如 E_USER_WARNING 或 E_USER_ERROR。

範例對比

以下是一個綜合範例,展示了這三種錯誤發出的方式及其處理方法:

這個範例中,Exception 和 Error 被捕捉並處理,而 trigger_error 生成的錯誤則由自訂錯誤處理函數處理。程式不會中止,並且會輸出所有錯誤訊息。

錯誤級別表

系統級別錯誤

錯誤級別中止程式引發者情境描述E_ERROR是系統致命的運行錯誤,例如無效的函數調用E_WARNING否系統運行時警告,例如包含不存在的文件E_PARSE是系統解析錯誤,例如語法錯誤E_NOTICE否系統運行時通知,例如使用未定義的變數E_CORE_ERROR是系統PHP 啟動時的致命錯誤E_CORE_WARNING否系統PHP 啟動時的警告E_COMPILE_ERROR是系統編譯時的致命錯誤E_COMPILE_WARNING否系統編譯時的警告E_STRICT否系統建議的代碼改進措施E_RECOVERABLE_ERROR否系統可捕捉的致命錯誤,例如類型錯誤E_DEPRECATED否系統運行時通知,不建議使用的代碼

用戶級別錯誤

錯誤級別中止程式引發者情境描述E_USER_ERROR是用戶 trigger_error()用戶生成的致命錯誤,例如自訂的致命錯誤E_USER_WARNING否用戶 trigger_error()用戶生成的警告,例如自訂的警告訊息E_USER_NOTICE否用戶 trigger_error()用戶生成的通知,例如自訂的通知訊息E_USER_DEPRECATED否用戶 trigger_error()用戶生成的過時警告,例如自訂的不建議使用的代碼警告

處理錯誤

以下介紹錯誤處裡的方法:
set_error_handler
set_exception_handler
register_shutdown_function

使用 set_error_handler 處理的錯誤

錯誤級別會中止程式引發者簡單描述情境E_WARNING否系統運行時警告,例如包含不存在的文件E_NOTICE否系統運行時通知,例如使用未定義的變數E_USER_WARNING否用戶 (trigger_error())用戶生成的警告E_USER_NOTICE否用戶 (trigger_error())用戶生成的通知E_USER_ERROR是用戶 (trigger_error())用戶生成的致命錯誤E_USER_DEPRECATED否用戶 (trigger_error())用戶生成的過時警告E_DEPRECATED否系統運行時通知,不建議使用的代碼E_RECOVERABLE_ERROR否系統可捕捉的致命錯誤,例如類型錯誤

使用 set_exception_handler 處理的例外

錯誤類型會中止程式引發者簡單描述情境Exception是用戶例如 throw new ExceptionError是用戶例如 throw new Error

使用 register_shutdown_function 處理的錯誤

錯誤級別會中止程式引發者簡單描述情境E_ERROR是系統致命的運行錯誤,例如無效的函數調用E_CORE_ERROR是系統PHP 啟動時的致命錯誤E_COMPILE_ERROR是系統編譯時的致命錯誤E_PARSE是系統解析錯誤,例如語法錯誤

這些表格展示了不同的錯誤處理方法以及它們可以處理的錯誤類型,確保你可以有效地處理所有可能發生的錯誤和例外。

錯誤處裡範例

set_error_handler()

系統只會有一個有作用的 set_error_handler(),後面設置的 handler 會覆蓋前面設置 handler,無法刪除,如有套件設置了,可以用覆蓋的或 set_error_handler(null) 使 handler 失去作用

try-catch

捕獲到 Error or Exception 可統一進行錯誤處裡,當然也可以捕獲後步處理,或存於 error_log

輸出:

錯誤日誌

錯誤日誌就像飛機的黑盒子,記錄著所有錯誤發生的詳細信息,讓我們能夠在錯誤發生後進行分析和診斷,從而提高應用程式的穩定性和可靠性。

以下是錯誤日誌寫法:

綜合錯誤處裡

錯誤日誌的記錄不僅有助於在開發過程中及早發現和修復問題,還能在生產環境中提供寶貴的錯誤追蹤信息。透過詳細的錯誤日誌記錄,我們可以了解錯誤發生的時間、錯誤類型、錯誤訊息以及錯誤發生的文件和行號,這些資訊讓我們快速修正非常重要。

[……]

閱讀更多

WAMP Server change default Browser to Chrome

開啟 WAMP Sever 居然是用 IE 11 開啟,到底對不對阿,這都什麼時期的產物了,雖然直接用瀏覽器輸入網址瀏覽本地端網頁也是可行,但心裡就是有個疙瘩,來哥教你改成用你愛的瀏覽器開

修改設定檔

如果安裝路徑沒有修改的話,開啟下面這個檔案,如果安裝路徑有修改的話,自己去找這個檔案。

用你愛用的文字編輯器打開,照到該死的這一行

替換成瀏覽器執行檔位置

關閉 WAMP Server 重新開啟,SEE Chrome 出現了,開勳

[……]

閱讀更多

PHP 上傳檔案,自訂錯誤訊息,當超過php.ini post_max_size 限制時

PHP上傳檔案會受限於 php.ini post_max_size 的值,這非常合理,但在程式中檔案上傳超過 post_max_size 時會直接中斷檔案上傳動作,吐出一個Warning 

在正式環境中,通常會關閉錯誤報告,程式中試著用 $_POST and $_FILES 找上傳檔案超出 post_max_size 的線索,皆回傳空值,如此一來程式很難判斷發生了怎麼一回事,沒辦法回應使用者目前情況,影響使用者體驗

透過以下代碼,可以透過PHP判斷上傳檔案超出 post_max_size 的錯誤,以便在輸出的頁面告訴使用者發生什麼事,當然也可以修改它,做需要的錯誤處裡

[……]

閱讀更多

IPv4 及 IPv6 最大字串長度

IPv4 address Max string Length

12個數字+3個分隔符=15個字符。

IPv6 address Max string Length

32個十六進制數字+ 7個分隔符= 39個字符。

包含保留映射IPv6地址的IPv4地址 = 45個字符

參考

https://stackoverflow.com/questions/1076714/max-length-for-client-ip-address/7477384#7477384

[……]

閱讀更多

PHP Cookie 儲存陣列資料

有個陣列,希望將陣列儲存至 Cookie 中,這裡提供兩種方法

在官網的範例中,可用下方的方式達成目的
https://www.php.net/manual/en/function.setcookie.php

output:

雖然是達到目的了,但事實上是建立了三個Cookie,怎麼看都不優雅,更難想像若是一個複雜的多惟陣列,會產生多少Cookie

再來介紹一個比較優雅的做法,我也比較喜歡,先將陣列序列化成字串存入Cookie

需要用到的時候,再將字串反序列化,是不是方便多了呢

output:

[……]

閱讀更多

PHP array_merge do not reset index

array_merge 用來進行2個或多個陣列合併

輸出結果:

輸出出結果,陣列的索引重新排序了。某些情況陣列的索引與值是有關聯的,這麼做丟失索引及值的關聯,目前 array_merge 並沒有是否重建索引的選項,所以要透過另外一種方式來合併陣列,並保持索引鍵與值的關聯。

透過下面的代碼實現:

輸出結果:

就這樣,用運算符「+」來進行陣列的累加,非常簡單,且保持 鍵與值的關聯。

請注意型態必須都為 array
但也不必太擔心,型態錯誤會報錯

[……]

閱讀更多