亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

何時拋出異常

何時拋出異常

C#
當年話下 2023-09-16 17:25:27
盡管我讀了很多有關異常處理的內容,但我仍然不確定何時拋出異常,何時不拋出異常。例如,我有一個三層架構的 API,并且在 DB 層中可能會發生事件。嘗試從數據庫接收客戶,但未找到具有給定 ID 的客戶。嘗試通過id刪除客戶,但在數據庫中找不到該id。嘗試通過 ID更新客戶,但在數據庫中找不到該 ID。在第一種情況下,我不會拋出異常,因為沒有什么真正“出錯”。我的存儲庫函數只是返回“null”來告訴上層沒有找到任何內容。但另外兩種情況已經很棘手了。如果找不到 id,deleteById 函數返回“null”,這對我來說沒有意義。如果刪除不成功,我可以返回“false”;如果刪除成功,我可以返回“true”。但隨后我必須將其從數據庫層通過領域層傳輸到表示層。拋出異常對我來說很容易。但在這種情況下,我也沒有產生“意外行為”。就像第一種情況一樣,沒有什么“出錯”。難道就沒有什么“最佳實踐”嗎?你會怎么辦?
查看完整描述

3 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

我認為在任何這些情況下都不應該拋出異常 - 原因如下:
異常應該用于特殊的事情 - 主要是你無法在代碼中控制的事情 - 例如網絡連接錯誤和類似的事情。

  • 嘗試從數據庫接收客戶,但未找到具有給定 ID 的客戶。

嗯,這是理所當然的 - 您在數據庫中沒有找到客戶 - 返回 null。沒有理由拋出異常,因為在這種情況下沒有什么異常。

  • 嘗試通過id刪除客戶,但在數據庫中找不到該id。

如果在數據庫中找到該客戶,則此操作將導致刪除該客戶。
如果在數據庫中沒有找到它 - 最終結果仍然與找到它一樣 - 那么你為什么要關心它一開始就不存在呢?同樣,沒有理由拋出異常。

  • 嘗試通過 ID更新客戶,但在數據庫中找不到該 ID。

這是最難解釋的,但基本上有兩種合法的方法來處理這種情況:

一種方法是,當更新語句具有不適合表中任何行的 where 子句時,執行任何數據庫執行的操作 - 這只是什么也不執行。
至于讓客戶端知道是否有實際更新或無操作,您可以檢查受影響的行數并向客戶端返回 true/false 或 customer/null。

另一種方法是將更新轉換為“更新插入” - 因此,如果在數據庫中找不到該客戶,只需創建一個新客戶即可。
這也可以使用簡單的真/假返回值向客戶端指示。在這種情況下,您應該正確命名該方法 -AddOrUpdateCustomer例如。


查看完整回答
反對 回復 2023-09-16
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

您不應使用異常作為向調用者發出預期執行流程信號的方式。當函數返回時,應該返回一個有意義的值。如果你的函數返回比較復雜,無法用簡單的truefalsereturns 來表達,你可以聲明 anenum作為返回值,甚至Tuple在更復雜的場景中也可以聲明 a 。

嘗試從數據庫接收客戶,但未找到具有給定 ID 的客戶。

嘗試通過id刪除客戶,但在數據庫中找不到該id。

嘗試通過 ID 更新客戶,但在數據庫中找不到該 ID。

所有這 3 種可能的情況都應該由數據庫很好地處理,當這樣的路徑發生時,只需向調用者返回一個包含足夠信息的值,以便它可以處理結果并正確執行操作。


查看完整回答
反對 回復 2023-09-16
?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

當出現意外錯誤時,您必須拋出異常。以你的例子=>

  1. getById 調用返回項 | 如果沒有找到則為 null => 如果不存在則沒有錯誤

  2. repo.Delete 函數必須有一個有效的 id => db 函數拋出異常(如果 ArgumentException 更好)...但是控制器/管理器需要 catch(ArgumentException) 然后有 2 個選項:

    2a. '刪除不存在的項目' => 成功 -> 方法調用后,項目不存在

    2b. es:控制器向客戶端發送錯誤消息“您要刪除的項目不存在”

  3. repo.Update 函數必須具有有效的 id => 像上面那樣沒有 2a 選項

如果函數需要這個參數=>拋出

if 函數管理 'not found=null' case => 不拋出


查看完整回答
反對 回復 2023-09-16
  • 3 回答
  • 0 關注
  • 144 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號