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

輸出:

錯誤日誌

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

以下是錯誤日誌寫法:

綜合錯誤處裡

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

[……]

閱讀更多

PHP json_encode sting in HTML input field

json_encode 輸出於 HTML input 發生異常

把PHP中的Array透過json_encode()轉換成Json格式輸出到HTML input value中如下:

輸出於 HTML 發生異常,只剩下左側「中括號」

主要原因是Json中的雙引號與HTML的雙引號打架

可以使用 htmlspecialchars() 簡單解決這問題

在執行 json_encode() 後再執行 htmlspecialchars() 如下方代碼

如此就正常輸出囉

https://stackoverflow.com/a/21887262

[……]

閱讀更多

Social Network Service (SNS) Share Link

Facebook

  • http://www.facebook.com/share.php?u=[URL]&t=[TITLE]&pic=[IMAGE]

Twitter

  • http://twitter.com/intent/tweet?text=[TITLE]&url=[URL]&pic=[IMAGE]

Google Plus

  • https://plus.google.com/share?url=[URL]&t=[TITLE]

Pinterest

  • https://www.pinterest.com/pin/create/button/?url=[URL]&description=[TITLE]&media=[IMAGE]

Linkedin

  • https://www.linkedin.com/sharing/share-offsite/?url=[URL]&title=[TITLE]

Delicious

  • http://del.icio.us/post?url=[URL]&title=[TITLE]

Tumblr

  • http://www.tumblr.com/share?v=3&u=[URL]&t=[TITLE]

Digg

  • http://digg.com/submit?phase=2&url=[URL]&title=[TITLE]

StumbleUpon

  • http://www.stumbleupon.com/submit?url=[URL]&title=[TITLE]

Reddit

  • http://reddit.com/submit?phase=2&url=[URL]&title=[TITLE]

新浪微博

  • http://v.t.sina.com.cn/share/share.php?title=[TITLE]+[URL]&pic=[IMAGE]

QQ 空间

  • http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=[URL]

人人网

  • http://share.renren.com/share/buttonshare.do?link=[URL]&title=[TITLE]

腾讯微博

  • http://v.t.qq.com/share/share.php?url=[URL]&title=[TITLE]

https://github.com/bradvin/social-share-urls
https://chon.io/notes/social-media-sharing-link-url/

[……]

閱讀更多

PHP function alias 方法別名

開發PHP專案的時候,有時會有更改 function 名稱的需求,也許當時是趕時間草率命名,也許是拼錯字,但隨時間推移,更改 function 的名字就變得很可怕,可能一改造成一連串的錯誤,但不改又很礙眼,感覺很痛苦,為避免錯誤連換爆的這個狀況,思考是否可以用「別名」的概念,讓新的 function 跟舊的 function 都可以做一樣的事情,在不發生錯誤的情況下慢慢汰除舊名字,隨著版本的演進直至所有舊名都被移除,最後再將「別名」移除

最簡單的做法

stackoverflow Jon 提供了一個最簡單的做法

https://stackoverflow.com/a/23426311

不過此做法存在缺陷,在 class 中呼叫會找不到 function

以下是目前最好解法

由 stackoverflow Nathan Crause 提出

https://stackoverflow.com/a/2877219/6784662

做了一點小修改

龜毛了一點,我習慣別名再右方,為維持這習慣我把上面方法做了一點小修改,更好理解

[……]

閱讀更多

三竹簡訊串接 – API 網址

三竹簡訊官方API文件,API Call 的網址如下:,

https://{三竹網域名稱}/b2c/mtk/SmSend

還以為真的是直接用他官網的網域,太天真了,弄半天結果不是,最後透過客服得知三竹簡訊目前帳號分為,個人帳號 (二站)、企業帳號 (三站),Call 的網址不同,call 的網址分別為下面兩個網址:

API 網址

企業帳號 (三站)
https://smsapi.mitake.com.tw/api/mtk/SmSend?

個人帳號 (二站)
http://smsb2c.mitake.com.tw/b2c/mtk/SmSend?

簡單測試API

[……]

閱讀更多

WAMP Server change default Browser to Chrome

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

修改設定檔

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

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

替換成瀏覽器執行檔位置

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

[……]

閱讀更多

XAMPP 換成 WAMP Server 安裝教學

XAMPP 一直來都是我裝在自己電腦中模擬開發環境使用,最大的優點的優點就是非常簡單,在 Windows 一鍵安裝完 MySQL、PHP、PHPMyAdmin,甚至連 Filezilla Server 都可以一次裝到好,省去逐一安裝及配置的時間,又有友善的介面可以開啟這些Server,實在是非常方便。

那麼方便幹嘛換,嘿對,隨時代的更迭,PHP、MySQL、Apache 都會釋出新版本,以 PHP來說 PHP5 到 PHP7 就是一個明顯陣痛過程,部分程式需要重構,但並非所有程式都會上PHP7,然而XAMPP雖然方便但它只安裝一種 PHP 版本,如果我裝 PHP7 的版本就無法開啟 PHP5 時期的程式,這是忽然要改 PHP5 的程式變成沒有這樣的開發環境了

我相信 XAMPP 一定有辦法手動去安裝舊版本的 PHP ,但一定免不了手動安裝及配置,在切換過程中也會需要一些設定,會搞得有一點不優雅,所以如果有更好的解決方案,為何不嘗試呢?想開發什麼版本就切換到哪個版版,WAMP Server 正好有這優點,聽起來是不是很棒呢,開始試試看吧

開始之前準備

安裝新環境時都要有個好習慣,記得先備份好之前的 XAMPP 檔案,還有匯出資料庫,天知道等下安裝後會發生什麼事,至少都還有還原的機會

下載 Wamp Server

官網下載:https://www.wampserver.com/en/

等一下!!! 這什麼瀏覽器?! IE11 為什麼會開啟骨灰級的瀏覽器,阿我也不知道,不行不行這我受不了,於是我把它改回我慣用的 Chrome,不然我心裡過不去阿

至於怎麼改呢?可以參考我另一篇文章

WAMP Server change default Browser to Chrome

控制面板

WAMP Server 開啟後,在 Windows 右下角常駐程式會出現這個 icon ,相關控制功能都在這邊

更改語言

接著滑鼠指標在 icon 的上按「右鍵」,「右鍵」「右鍵」是「右鍵」,就會出現相關設定選單,其中有一個 Language 的選單,但當然不是只有俄文拉,WAMP 內建一堆語言。

再來就是 WAMPP

相容 WAMP 最酷的地方

身為一個 PHP 程序員,電腦裝個幾個版本的 PHP 也是很正常的,在 WAMP 中可以允許我們切換不同版本的 PHP 就在這邊,就這麼簡單,基本的功能面板都在這邊,除此之外還提供很多好用的工具,這就要自己慢慢完囉

相容 XAMPP 不必卸載

最後,XAMPP 與 WAMP Server 的環境都是分別獨立的,連資料庫都是,只要不要同時開啟,基本上兩者都可以使用

[……]

閱讀更多