第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

何時(shí)拋出異常

何時(shí)拋出異常

C#
當(dāng)年話下 2023-09-16 17:25:27
盡管我讀了很多有關(guān)異常處理的內(nèi)容,但我仍然不確定何時(shí)拋出異常,何時(shí)不拋出異常。例如,我有一個(gè)三層架構(gòu)的 API,并且在 DB 層中可能會(huì)發(fā)生事件。嘗試從數(shù)據(jù)庫(kù)接收客戶,但未找到具有給定 ID 的客戶。嘗試通過(guò)id刪除客戶,但在數(shù)據(jù)庫(kù)中找不到該id。嘗試通過(guò) ID更新客戶,但在數(shù)據(jù)庫(kù)中找不到該 ID。在第一種情況下,我不會(huì)拋出異常,因?yàn)闆](méi)有什么真正“出錯(cuò)”。我的存儲(chǔ)庫(kù)函數(shù)只是返回“null”來(lái)告訴上層沒(méi)有找到任何內(nèi)容。但另外兩種情況已經(jīng)很棘手了。如果找不到 id,deleteById 函數(shù)返回“null”,這對(duì)我來(lái)說(shuō)沒(méi)有意義。如果刪除不成功,我可以返回“false”;如果刪除成功,我可以返回“true”。但隨后我必須將其從數(shù)據(jù)庫(kù)層通過(guò)領(lǐng)域?qū)觽鬏數(shù)奖硎緦?。拋出異常?duì)我來(lái)說(shuō)很容易。但在這種情況下,我也沒(méi)有產(chǎn)生“意外行為”。就像第一種情況一樣,沒(méi)有什么“出錯(cuò)”。難道就沒(méi)有什么“最佳實(shí)踐”嗎?你會(huì)怎么辦?
查看完整描述

3 回答

?
鴻蒙傳說(shuō)

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例如。


查看完整回答
反對(duì) 回復(fù) 2023-09-16
?
拉風(fēng)的咖菲貓

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)單的truefalsereturns 來(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í)行操作。


查看完整回答
反對(duì) 回復(fù) 2023-09-16
?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊

當(dāng)出現(xiàn)意外錯(cuò)誤時(shí),您必須拋出異常。以你的例子=>

  1. getById 調(diào)用返回項(xiàng) | 如果沒(méi)有找到則為 null => 如果不存在則沒(méi)有錯(cuò)誤

  2. 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)目不存在”

  3. repo.Update 函數(shù)必須具有有效的 id => 像上面那樣沒(méi)有 2a 選項(xiàng)

如果函數(shù)需要這個(gè)參數(shù)=>拋出

if 函數(shù)管理 'not found=null' case => 不拋出


查看完整回答
反對(duì) 回復(fù) 2023-09-16
  • 3 回答
  • 0 關(guān)注
  • 158 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)