在使用業務處理PHP問題的時候, 肯定會考慮到程序之間交互(mysql, redis, memcached...)的返回值問題. 一般來說, 針對業務會考慮到如果數據庫插入失敗怎么辦, redis 的命令執行失敗怎么辦,可能是網絡超時, 或者服務器崩潰等原因導致, 但是這些情況發生時,我常常不知道程序這邊要如何處理, 比如, 數據庫插入失敗, 那么pdo的inset方法是返回一個false還是程序直接報異常? phpredis 在操作redis的時候網絡斷開了, 是返回null還是程序異常?歸根結底, 是對每個方法的返回值或者類庫對各種可能不成功的原因的處理方式上不熟悉, 導致需要用極其繁瑣的 if $return === 1 這樣的嚴格判斷來確定下一步程序走向, 導致代碼很不整潔.考慮過使用try 和 catch 來包裹整個數據庫插入代碼段, 但是又怕插入失敗返回的僅是 $return=0,那就失去了意義.請問各位大佬, 在處理這些與mysql和redis交互的邏輯時,是否有一個統一的記憶方法來判斷命令執行是成功還是失敗?還是說必須通過文檔熟記每一個方法在執行時,對每一個錯誤(網絡斷開,要交互的服務器崩潰,被拒絕連接...)的返回值熟記于心才行?
2 回答

慕少森
TA貢獻2019條經驗 獲得超9個贊
這就是錯誤機制的處理方法。
首先try ... catch..
是必須要做的標準開發編程手段。其次在catch里面,通常要分清楚錯誤類型,數據庫錯誤,網絡錯誤,綜合錯誤等等。然后根據不同的錯誤做處理。如果是與api做鏈接,那么通常要返回非200的response,然后api端要做請求或者推送沒有成功的記錄,為下一次推送做準備。如果是非api的程序,通常要保存請求的數據方便日后回復。關于保存請求數據的做法通常是走一個完全獨立的數據庫,避免因主機連接問題導致無法記錄錯誤日志,可以是遠程的(這個是比較推薦的,借用第三方處理log),可以是本地的。如果在網絡不通的情況下,最原始的保存是在本地文件里面。如果是非常極端的情況,那就不是程序應該處理的范圍了。

阿波羅的戰車
TA貢獻1862條經驗 獲得超6個贊
對于 MySQL,默認是靜默模式(既不警告又不拋出異常)。
但是我們可以通過手動設置來讓 PDO 拋出異常
$pdo = new PDO(
$config['dsn'], $config['username'], $config['password'],
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]
);
對于 Redis,只要無法連接服務器就會拋出異常。
所以還是有辦法通過 try ... catch
來優雅處理這些問題的。
- 2 回答
- 0 關注
- 361 瀏覽
添加回答
舉報
0/150
提交
取消