在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

回答
編輯回答
雅痞

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

clipboard.png

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

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

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

clipboard.png

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

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

這就是錯(cuò)誤機(jī)制的處理方法。

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

2018年9月4日 03:25