狠狠撸

狠狠撸Share a Scribd company logo
W31 Error Handling:
Error Code vs. Exception
Chieh Yu @ 2021/08/03
Outline
● Error Code
● Exception
● 效能影響
● 語言慣例
● 結論
Error Code
● 使用 return value 或 global variable 來處理錯誤
○ if ((rc = foo()) < 0) { // … } / errno & GetLastError()
● 優點
○ 簡單好懂
○ 使用上簡單
○ 錯誤處理貼近發生錯誤的位置
○ 和 C library 整合容易
● 缺點
○ 重複的 code 多 => 重複出現時寫起來重複、看起來也雜訊多
○ 錯誤處理和正常流程耦合度高
○ 若沒有處理,程式可能運作在好與不好之間
Exceptions
● 使用 try-catch 來處理錯誤
● 優點
○ 強迫開發一定要處理錯誤,否則程式會結束
○ 可以集中錯誤偵測與處理的 code
○ 正常流程的 code 可以更緊湊
○ 錯誤處理跨越 function call,中間的 layer 可以不用管其他層
● 缺點
○ 概念較複雜,需妥善設計錯誤處理位置
○ 若沒有好好處理,錯誤可能消失於無形之中
○ 古早時期認為效能較差 (已經不存在)
Error handling: error code vs. exception
效能影響
● Error code
○ 需檢查 return value
○ 若 return value 傳遞是靠 memory 影響更大
● Exception
○ try block 需要 data structure 追蹤 stack,佔用一些記憶體
○ 需要一些 code 去檢查是否有噴出 exception 和 unwind stack
○ 若沒發生 throw, 效能影響微乎其微
● 測試結果 [1][2]
○ 看情況,寫的好,Exception 比較快
○ 在 performance critical 的 loop 內,正常的流程與錯誤處理高度耦合且固定會發生錯誤的情況 => Error
code
https://dr-knz.net/go-errors-vs-exceptions-2020.html
語言慣例
● C: error code
● C++: error code and exception (M$ 說主流是 exception)
● Java/Kotlin: exception
● Go: error code
● Rust: error code
● JavaScript: 無 (誤)
● Note: 文章都不錯看,可以參考一下
結論
● Error code 和 Exception 都好棒棒
○ 各自有適合的場景
● 其實混用並不衝突
○ 如在 performance critical 的 loop 內,正常的流程與錯誤處理高度耦合且固定會發生錯誤的情況
。e.g. HTTP server no such URL
● 建議依照語言慣例使用
○ 若沒有慣例則由團隊 / 公司建立共識
Thank you~ ?

More Related Content

Error handling: error code vs. exception

  • 1. W31 Error Handling: Error Code vs. Exception Chieh Yu @ 2021/08/03
  • 2. Outline ● Error Code ● Exception ● 效能影響 ● 語言慣例 ● 結論
  • 3. Error Code ● 使用 return value 或 global variable 來處理錯誤 ○ if ((rc = foo()) < 0) { // … } / errno & GetLastError() ● 優點 ○ 簡單好懂 ○ 使用上簡單 ○ 錯誤處理貼近發生錯誤的位置 ○ 和 C library 整合容易 ● 缺點 ○ 重複的 code 多 => 重複出現時寫起來重複、看起來也雜訊多 ○ 錯誤處理和正常流程耦合度高 ○ 若沒有處理,程式可能運作在好與不好之間
  • 4. Exceptions ● 使用 try-catch 來處理錯誤 ● 優點 ○ 強迫開發一定要處理錯誤,否則程式會結束 ○ 可以集中錯誤偵測與處理的 code ○ 正常流程的 code 可以更緊湊 ○ 錯誤處理跨越 function call,中間的 layer 可以不用管其他層 ● 缺點 ○ 概念較複雜,需妥善設計錯誤處理位置 ○ 若沒有好好處理,錯誤可能消失於無形之中 ○ 古早時期認為效能較差 (已經不存在)
  • 6. 效能影響 ● Error code ○ 需檢查 return value ○ 若 return value 傳遞是靠 memory 影響更大 ● Exception ○ try block 需要 data structure 追蹤 stack,佔用一些記憶體 ○ 需要一些 code 去檢查是否有噴出 exception 和 unwind stack ○ 若沒發生 throw, 效能影響微乎其微 ● 測試結果 [1][2] ○ 看情況,寫的好,Exception 比較快 ○ 在 performance critical 的 loop 內,正常的流程與錯誤處理高度耦合且固定會發生錯誤的情況 => Error code
  • 8. 語言慣例 ● C: error code ● C++: error code and exception (M$ 說主流是 exception) ● Java/Kotlin: exception ● Go: error code ● Rust: error code ● JavaScript: 無 (誤) ● Note: 文章都不錯看,可以參考一下
  • 9. 結論 ● Error code 和 Exception 都好棒棒 ○ 各自有適合的場景 ● 其實混用並不衝突 ○ 如在 performance critical 的 loop 內,正常的流程與錯誤處理高度耦合且固定會發生錯誤的情況 。e.g. HTTP server no such URL ● 建議依照語言慣例使用 ○ 若沒有慣例則由團隊 / 公司建立共識

Editor's Notes

  1. https://dr-knz.net/go-errors-vs-exceptions-2020.html