国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP批斗大會之缺失的異常詳解

2024-05-05 00:10:16
字體:
來源:轉載
供稿:網友

故事的開始

這幾天觀察錯誤日志發現有一個數據反序列化的notice錯誤,實際情況我是從緩存中讀取數據然后反序列化,因為反序列化失敗,所以實際每次都是去數據庫取的值。背后性能影響還是挺大的。

缺失的異常

剛開始寫代碼的時候一直不明白為什么要用異常,感覺if else就能搞定了,為什么還要多此一舉,現在反而覺得 php 的異常太少。

對比兩種序列化場景,一個是json,另一個是serialize。

json

在json encode/decode的時候,如果出現異常,可以通過json_last_error()來獲取。

https://www.php.net/manual/en...

這樣的設計只能說勉強夠用,不太符合面向對象的套路。

serialize/unserialize

在使用自帶的序列化和反序列化的時候,相比json的處理,則更加簡單粗暴,沒有函數能拿到最后的錯誤,只會通過自定義的error handler來接管,然后自己去做出一些相應的處理。

為什么要捕獲異常

比如我的代碼比較亂,有的 key 是 json 序列化,有的 key 是 serialize。我們可以將 key 分類。不能確保其他人配置的對應關系是對的,或者有的人忘記了,所以我需要用捕獲異常的方式來兜底,這樣我們的代碼更加健壯一些。當unserialize失敗之后,我們可以嘗試去json_decode,而不是立即返回一個false,從而把請求傳遞到數據庫。

代碼演示

error_reporting(E_ALL);$a = ["a" => 1];class UnSerializeException extends ErrorException{}set_error_handler(function ($severity, $message, $file, $line) {  $info = explode(":", $message);  if ($severity == E_NOTICE) {    if ($info[0] == "unserialize()") {      throw new UnSerializeException($message);    }    return true;  } else {    throw new ErrorException($message, 0, $severity, $file, $line);;  }});try {  $b = unserialize(json_encode($a));} catch (ErrorException $exception) {  var_dump(get_class($exception), $exception->getMessage(), $exception->getTraceAsString()); // 捕獲到了} finally {  restore_error_handler();}try {  $b = unserialize(json_encode($a));} catch (ErrorException $exception) {  var_dump(get_class($exception), $exception->getMessage(), $exception->getTraceAsString()); // 無法捕獲}

輸出結果

string(20) "UnSerializeException"
string(43) "unserialize(): Error at offset 0 of 7 bytes"
string(181) "#0 [internal function]: {closure}(8, 'unserialize(): ...', '/Users/mengkang...', 34, Array)
#1 /Users/mengkang/PhpstormProjects/xxx/test.php(34): unserialize('{"a":1}')
#2 {main}"

Notice: unserialize(): Error at offset 0 of 7 bytes in /Users/mengkang/PhpstormProjects/xxx/test.php on line 42

后記

所以 php 代碼的異常設計還是任重而道遠的,而這些已經設定的“舊的規范”要推翻,需要“勇氣”,畢竟會影響所有的使用者。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 行唐县| 禄丰县| 普格县| 房产| 年辖:市辖区| 澄城县| 威远县| 石嘴山市| 凌云县| 河南省| 巢湖市| 班玛县| 普定县| 深州市| 南宁市| 松桃| 廉江市| 临夏县| 洪洞县| 绩溪县| 兰考县| 蒙山县| 自治县| 新余市| 漳浦县| 茂名市| 开化县| 黎城县| 监利县| 临汾市| 长顺县| 宿州市| 乌什县| 克山县| 安乡县| 吉首市| 嵊泗县| 虎林市| 永寿县| 贵阳市| 临海市|