2011-01-12 105 views
17

遺留錯誤處理傾向於遵循所有函數根據成功/失敗返回代碼的方法。你會檢查這段代碼並適當地處理(如果有錯誤)。爲什麼拋出異常而不是返回錯誤代碼更好?

但是,現代編程語言遵循異常模型,如果發生某些異常發生無法正常處理的異常,則會拋出異常 - 這會一直處於冒泡狀態,直到處理完爲止。

我的問題是爲什麼我們要移向例外模型?這背後的原因是什麼?爲什麼它更好?

解釋/鏈接將不勝感激。

回答

20

我在寫的長度大約是:Exceptions vs. status returns,但簡要地說:

  1. 例外讓你的代碼乾淨所有的檢查測試在每次調用返回狀態,必要時,
  2. 例外讓你使用實際值的函數返回值,
  3. 異常可以包含比狀態返回更多的信息,
  4. 最重要的是:異常不能通過無效操作來忽略,而狀態返回可以。

爲了擴大最後一點:如果您忘記做狀態回報應該做的事情,您會忽略錯誤。如果您忘記了執行例外應該做的事情,那麼異常會冒泡到軟件的外層,從而變得可見。

+1

你沒有離開你的列表使用異常的事實允許try/catch(MyCustomException ex),這樣你/(其他開發人員)可以添加try/catches,只會捕獲新類型的異常創建。 – 2011-01-12 16:21:55

9

這裏有幾個原因

  • 忽略異常,需要由開發人員操作而忽略壞的返回值需要恰好爲0的動作。從理論上講,這使得開發人員更有可能處理一個錯誤,而忽略它,甚至意識到它正在發生。
  • 在錯誤點和處理之間提供更清晰的分隔。它不會強制在兩者之間的每個點上手動傳播錯誤。
  • 異常可能比簡單的錯誤代碼更大,更豐富的信息有效負載。有些方法可以用錯誤代碼來做到這一點,但它更多的是事後考慮,並且有點麻煩。
2

如果狀態碼錶示函數的立即調用代碼準備處理的情況,那麼狀態碼通常優於例外狀態碼。狀態碼的問題是,如果直接調用代碼不處理它們,那麼可能什麼都不會。如果代碼拋出一個異常並且直接調用代碼沒有準備好處理它,那麼這個異常就會傳播到至少聲稱如此準備好的代碼。

相關問題