3 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
我認(rèn)為在任何這些情況下都不應(yīng)該拋出異常 - 原因如下:
異常應(yīng)該用于特殊的事情 - 主要是你無(wú)法在代碼中控制的事情 - 例如網(wǎng)絡(luò)連接錯(cuò)誤和類似的事情。
嘗試從數(shù)據(jù)庫(kù)接收客戶,但未找到具有給定 ID 的客戶。
嗯,這是理所當(dāng)然的 - 您在數(shù)據(jù)庫(kù)中沒(méi)有找到客戶 - 返回 null。沒(méi)有理由拋出異常,因?yàn)樵谶@種情況下沒(méi)有什么異常。
嘗試通過(guò)id刪除客戶,但在數(shù)據(jù)庫(kù)中找不到該id。
如果在數(shù)據(jù)庫(kù)中找到該客戶,則此操作將導(dǎo)致刪除該客戶。
如果在數(shù)據(jù)庫(kù)中沒(méi)有找到它 - 最終結(jié)果仍然與找到它一樣 - 那么你為什么要關(guān)心它一開(kāi)始就不存在呢?同樣,沒(méi)有理由拋出異常。
嘗試通過(guò) ID更新客戶,但在數(shù)據(jù)庫(kù)中找不到該 ID。
這是最難解釋的,但基本上有兩種合法的方法來(lái)處理這種情況:
一種方法是,當(dāng)更新語(yǔ)句具有不適合表中任何行的 where 子句時(shí),執(zhí)行任何數(shù)據(jù)庫(kù)執(zhí)行的操作 - 這只是什么也不執(zhí)行。
至于讓客戶端知道是否有實(shí)際更新或無(wú)操作,您可以檢查受影響的行數(shù)并向客戶端返回 true/false 或 customer/null。
另一種方法是將更新轉(zhuǎn)換為“更新插入” - 因此,如果在數(shù)據(jù)庫(kù)中找不到該客戶,只需創(chuàng)建一個(gè)新客戶即可。
這也可以使用簡(jiǎn)單的真/假返回值向客戶端指示。在這種情況下,您應(yīng)該正確命名該方法 -AddOrUpdateCustomer
例如。

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
您不應(yīng)使用異常作為向調(diào)用者發(fā)出預(yù)期執(zhí)行流程信號(hào)的方式。當(dāng)函數(shù)返回時(shí),應(yīng)該返回一個(gè)有意義的值。如果你的函數(shù)返回比較復(fù)雜,無(wú)法用簡(jiǎn)單的true
/ false
returns 來(lái)表達(dá),你可以聲明 anenum
作為返回值,甚至Tuple
在更復(fù)雜的場(chǎng)景中也可以聲明 a 。
嘗試從數(shù)據(jù)庫(kù)接收客戶,但未找到具有給定 ID 的客戶。
嘗試通過(guò)id刪除客戶,但在數(shù)據(jù)庫(kù)中找不到該id。
嘗試通過(guò) ID 更新客戶,但在數(shù)據(jù)庫(kù)中找不到該 ID。
所有這 3 種可能的情況都應(yīng)該由數(shù)據(jù)庫(kù)很好地處理,當(dāng)這樣的路徑發(fā)生時(shí),只需向調(diào)用者返回一個(gè)包含足夠信息的值,以便它可以處理結(jié)果并正確執(zhí)行操作。

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
當(dāng)出現(xiàn)意外錯(cuò)誤時(shí),您必須拋出異常。以你的例子=>
getById 調(diào)用返回項(xiàng) | 如果沒(méi)有找到則為 null => 如果不存在則沒(méi)有錯(cuò)誤
repo.Delete 函數(shù)必須有一個(gè)有效的 id => db 函數(shù)拋出異常(如果 ArgumentException 更好)...但是控制器/管理器需要 catch(ArgumentException) 然后有 2 個(gè)選項(xiàng):
2a. '刪除不存在的項(xiàng)目' => 成功 -> 方法調(diào)用后,項(xiàng)目不存在
2b. es:控制器向客戶端發(fā)送錯(cuò)誤消息“您要?jiǎng)h除的項(xiàng)目不存在”
repo.Update 函數(shù)必須具有有效的 id => 像上面那樣沒(méi)有 2a 選項(xiàng)
如果函數(shù)需要這個(gè)參數(shù)=>拋出
if 函數(shù)管理 'not found=null' case => 不拋出
- 3 回答
- 0 關(guān)注
- 158 瀏覽
添加回答
舉報(bào)