鍍金池/ 問答/PHP/ php 開發(fā)針對異常處理的一些困惑?

php 開發(fā)針對異常處理的一些困惑?

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

回答
編輯回答
雅痞

對于 MySQL,默認是靜默模式(既不警告又不拋出異常)。

clipboard.png

但是我們可以通過手動設(shè)置來讓 PDO 拋出異常

$pdo = new PDO(
            $config['dsn'], $config['username'], $config['password'],
            [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            ]
        );

對于 Redis,只要無法連接服務(wù)器就會拋出異常。

clipboard.png

所以還是有辦法通過 try ... catch 來優(yōu)雅處理這些問題的。

2017年8月28日 16:40
編輯回答
逗婦惱

這就是錯誤機制的處理方法。

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

2018年9月4日 03:25