簡體   English   中英

為什么拋出異常比返回錯誤代碼更好?

[英]Why is it better to throw an exception rather than return an error code?

傳統錯誤處理傾向於遵循所有函數根據成功/失敗返回代碼的方法。 您將檢查此代碼並適當處理(如果有錯誤)。

然而,現代編程語言遵循異常模型,如果發生了無法正確處理的異常情況,則會拋出異常 - 在處理之前會不斷冒泡。

我的問題是為什么我們要轉向異常模型 這背后的原因是什么? 為什么更好?

解釋/鏈接將不勝感激。

我已經詳細地寫過這個: Exceptions vs. status returns ,但簡要地說:

  1. 當每次調用都返回測試狀態時,異常使您的代碼無需進行所有必要的檢查,
  2. 異常允許您將函數的返回值用於實際值,
  3. 異常可以攜帶比狀態返回更多的信息,
  4. 最重要的是:不能通過不作為而忽略異常,而狀態返回則可以。

擴展最后一點:如果你忘記做你應該做的狀態返回,你會忽略錯誤。 如果您忘記對異常做您應該做的事情,則異常會冒泡到軟件的外層,在那里它變得可見。

這里有幾個原因

  • 忽略異常需要開發人員的操作,而忽略錯誤的返回值需要正好為 0 的操作。 從理論上講,這使得開發人員更有可能處理錯誤,而不是忽略它或什至沒有意識到它正在發生。
  • 在錯誤點和處理之間提供更清晰的分離。 它不會強制在中間的每個點手動傳播錯誤。
  • 與簡單的錯誤代碼相比,異常可以提供更大更豐富的信息負載。 有一些方法可以使用錯誤代碼來做到這一點,但這更多是事后的想法,而且有點麻煩。

is prepared to handle.狀態代碼通常比異常更好,因為它們表示函數的准備處理的情況。 狀態代碼的問題在於,如果立即調用代碼不處理它們,則很可能什么都不會。 如果代碼拋出異常並且立即調用的代碼不准備處理它,則異常將傳播到至少聲稱已准備好的代碼。

拋出異常是明確指出出現問題的,程序員更難忽略這一點(因為如果沒有 catch 塊,程序將終止)。

異常將終止函數其余部分的執行,並將控制權傳遞給下一個 catch 塊(如果當前調用堆棧中有任何。如果沒有,則程序將終止)


對於 Javascript

是的,它是可選的,但您應該始終使用.catch()處理程序(用於 Promises)。

這意味着,我們可以在一個處理程序中處理許多函數中的許多錯誤,如下所示;

storeData()
    .then(changeSomething)
    .then(storeData)
    .catch((e) => {
        // Handle the error.
    })

在這里我們可以看到如何處理三個不同函數的錯誤。 本質上,catch 的行為就像它將所有函數包裝在同步 try/catch 中一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM