🌕 Go 錯誤處理的語法支援:有或無?
➤ 探索 Go 錯誤處理演進之路,以及未來可能的方向。
https://go.dev/blog/error-syntax
Go 程式語言長期以來受到批評,因為其錯誤處理機制冗長繁瑣,經常導致程式碼中充斥著 `if err != nil` 的檢查。Go 團隊多次嘗試改善這一問題,提出了包括 `check/handle`、`try` 以及最近的 `?` 運算子的方案,但都因各種原因未能獲得廣泛支持。文章回顧了這些提案的演進、遇到的阻礙,以及 Go 團隊從中汲取的教訓,並探討了未來改善 Go 錯誤處理的可能性。
+ 讀者A:Go 的錯誤處理確實很冗長,希望未來能有更簡潔的方案,提高開發效率。
+ 讀者B:文章詳細地記錄了 Go 團隊的嘗試和思考,可以看出他們一直在努力改善語言的實用性,即便過程充滿挑戰。
#程式語言 #Go #錯誤處理
[ On | No ] syntactic support for error handling - The Go Programming Language

Go team plans around error handling support

🌕 Go 語言中的結構化錯誤處理
➤ 提升 Go 語言錯誤管理效率的實用方案
https://southcla.ws/structured-errors-in-go
本文探討了在 Go 語言中處理錯誤的方式,特別是在中型 HTTP API 專案中。作者指出 Go 語言的錯誤處理機制雖然簡單,但缺乏結構化,導致日誌資訊難以有效篩選與分析。文章提出了一種簡潔的方法和新的函式庫,旨在提升錯誤管理的便利性,並將錯誤資訊與日誌紀錄更好地結合,方便問題診斷和排查。作者強調了良好開發體驗的重要性,認為簡化流程能鼓勵開發者積極使用結構化錯誤處理,從而提高程式碼品質。
+ 這篇文章點出了 Go 語言錯誤處理的一大痛點,我常常需要花很多時間從一堆文字日誌中找到真正有用的資訊。
+ 作者提到的 "ergonomics" 觀點很有道理,如果能讓結構化錯誤處理變得更簡單,一定能提高團隊的開發效率。
#Go 語言 #錯誤處理 #日誌紀錄 #開發效率
Structured errors in Go | barney's tech blog

Bridge the gap between structured logging and errors in Go

Matt Godbolt sold me on Rust by showing me C++ | Hacker News

LinkMatt Godbolt 以 C++ 示範說服我學 Rust
https://collabora.com/news-and-blog/blog/matt-godbolt-sold-me-on-rust-by-showing-me-cplusplus.html

📌 Summary:
文章從 Matt Godbolt 在 Compiler Explorer 的知名度談起,介紹他在演講「Correct by Construction: APIs That Are Easy to Use and Hard to Misuse」中提到 C++ 中常見的錯誤及其防範困難,並以送出股票訂單函式為範例,深入探討 C++ 中因型別不夠嚴謹導致的混淆與錯誤問題,包含參數位置錯誤、隱式類型轉換及負數不當使用等。作者示範如何用 C++ 類別與模板嘗試限制錯誤使用,但仍面臨程式碼複雜度高與執行期錯誤風險。相較之下,Rust 透過強型別系統、明確的型別轉換、編譯期錯誤訊息與 Result 型別強制錯誤處理,大幅減少這些問題。Rust 不只專注於記憶體安全,更在設計層面降低簡單錯誤發生,讓開發者不需過度思考保護措施,進而提升可靠度與維護性。最後討論 Rust 仍有學習曲線和借用檢查器限制,但其嚴謹的型別系統與錯誤處理設計在實務應用上提供明顯優勢,並激勵讀者關注 Matt Godbolt 的相關內容與工具。

🎯 Key Points:
★ C++ 範例展示問題
→ 以 sendOrder 函式作為例子,使用基本型別(double、int)易因隱式類型轉換導致參數錯置,不會在編譯期被警告。
→ 嘗試用 typedef 與類別包裝,如 Price、Quantity,搭配 explicit 建構子與 unsigned 型別提升型別安全度,但仍無法避免使用者透過字串轉換插入錯誤數值(如負數)且無法於編譯期偵測。

★ Rust 在防範錯誤上的優勢
→ Rust 函式在參數型別不匹配時直接編譯失敗,且會提供明確錯誤訊息建議。
→ 可用 struct 封裝型別,無法將錯誤數值(如負數對 unsigned)編譯通過。
→ 用 Result 和 .parse() 函式將轉換錯誤回報為編譯期錯誤,迫使使用者明確處理錯誤,避免潛藏的執行期錯誤。
→ Rust 的錯誤處理有一套統一機制(Result)且搭配 ? 運算子,使錯誤傳播及處理變得簡潔且安全。

★ 語言設計的啟發
→ Rust 除了眾所皆知的記憶體安全,還能在日常型別使用與 API 設計層面大幅降低簡單但致命的錯誤。
→ 使用 Rust 可省去許多保護性思考,讓開發者能專注於邏輯實作,減少隱藏型錯誤的風險。
→ 學習曲線如借用檢查器初期不易,但熟悉後可大幅提升程式健全性。
→ 建議關注 Matt Godbolt 的線上資源與 Compiler Explorer 工具,深入瞭解此類設計思維。

🔖 Keywords:
#Rust #C++ #型別安全 #錯誤處理 #Matt_Godbolt

Matt Godbolt sold me on Rust by showing me C++ | Hacker News

🌘 為什麼 Go 的錯誤處理如此棒
➤ Go 錯誤處理的優勢與必要性
https://rauljordan.com/why-go-error-handling-is-awesome/
Go 語言的錯誤處理雖然常被批評為設計缺陷,但實際上其背後有深刻的程式語言理論支持。Go 將錯誤視為一級公民,促使開發者在編寫函數時必須考慮錯誤處理,不同於其他語言中的隱式處理方式。透過簡單明瞭的語法,Go 讓開發者對錯誤的處理負起完全責任,並提供了便於追蹤的錯誤鏈管理機制。
+ 這篇文章讓我重新評價了對 Go 語言的看法,尤其在錯誤處理的設計上。我認為這種方法值得其他語言學習。
+ 雖然 Go 的錯誤處理方式不盡完美,但文章清楚解釋了其背後的理念,讓我更理解這種設計的價值。
##golang #錯誤處理
Using Interface Composition in Go As Guardrails

rauljordan::blog

Oh Shit, Git!?!

Link📌 Summary: 在使用 Git 時,即使一個小錯誤也可能造成困擾,解決問題往往需要深入瞭解。本文整理了幾個常見的錯誤操作及其解決方法,包括如何利用 git reflog 回到先前狀態、修改最近的提交、變更提交訊息、從錯誤分支回到正確分支等。這些技巧若能熟練運用,能有效減少在版本控制過程中的挫折感。

🎯 Key Points:
- 使用 git reflog 恢復到先前狀態,無論是找回誤刪檔案或修復錯誤合併。
- 可以利用 git commit --amend 快速修改最後的提交,但注意不應該修改已推送的提交。
- 若誤將提交放在錯誤分支,可透過 git reset 和 git stash 將變更轉移到正確分支上。
- 回溯早前的提交可使用 git revert,這樣不需手動復原檔案內容。
- 當整個 repo 混亂時,可以透過 git fetch、git reset 和 git clean 重置至遠端狀態,注意這是無法恢復的行為。

🔖 Keywords: #Git #版本控制 #錯誤處理 #提交修正 #分支管理

Oh Shit, Git!?!

🌘 謬誤無處不在: 如何集中和結構化錯誤處理
➤ 深度探討如何由簡單錯誤處理方法進化為結構化架構,帶來管理錯誤的新思維。
https://olivernguyen.io/w/namespace.error/
透過 Go 簡單又靈活處理錯誤—卻缺乏結構!隨著程式碼庫增長、開發人員增多,以及“快速修復”積累,簡單的錯誤處理變得混亂。錯誤訊息不一致,各自擁有風格、常數或自訂錯誤類型,難以管理。建立結構化、集中系統來讓錯誤有意義、可追蹤,帶來安心!
+ 有系統的錯誤處理確實提升程式的穩定性和開發效率。
+ 深入瞭解 Go 錯誤處理策略的轉變,對開發團隊是很好的啟示。
#錯誤處理
Errors, Errors Everywhere: How We Centralized and Structured Error Handling

Handling errors in Go is simple and flexible – yet no structure! It’s supposed to be simple, right? Just return an error , wrapped with a message, and move on. Well, that simplicity quickly turns into chaotic as our codebase grows with more packages, more developers, and more “quick fixes” that stay there forever. Over time, the logs are full of “failed to do this” and “unexpected that”, and nobody knows if it’s the user’s fault, the server’s fault, buggy code, or it’s just a misalignment of the stars!

Oliver Nguyen
🌘 Clojure 中的成語錯誤及異常拋出
➤ 錯誤處理方式多樣,選擇取決於情況
https://www.daveliepmann.com/articles/idiomatic-clojure-errors.html
Clojure的成語慣用法包括拋出本地異常,使用 ex-info 傳遞資料,以及返回錯誤映射,這些都是動態 lisp 的成語。在錯誤處理上沒有一種固定的正確方式,而是多種方式並行,且重要的是能自由選擇。Dave Liepmann在文章中討論了 Clojure 的錯誤處理方法和技巧。
+ 這篇文章清楚解釋了Clojure中在錯誤處理方面的不同選擇,讓人對如何選擇適合的方法有更深入的理解。
+ 多種錯誤處理方式讓人眼花繚亂,但也提醒了我們在開發中要根據情況靈活選擇適合的方法。
#Clojure #語言編程 #錯誤處理
Idiomatic errors in Clojure

Dave Liepmann's home on the web

My negative views on Rust

Link📌 Summary: 本文概述了作者對Rust程式語言的負面看法,探討了語言的優缺點。作者喜歡Rust的宏、類型系統和標準庫,但對其不安全性及錯誤處理機制表示擔憂。同時指出Rust的複雜性和對記憶體效率的過於追求可能令新手感到困惑。此外,作者認為Rust社群友好卻隨著使用者增多逐漸變得競爭。同時,Rust缺乏內建的異步運行時也導致問題,最後對Rust作為通用語言的功能性表示失望。

🎯 Key Points:
- 優點:包括優秀的宏、類型系統、記錄處理及UTF-8字串支持。
- 不安性與錯誤處理:使用不安全代碼之風及不同的錯誤處理機制令人困惑。
- 語言複雜性:隨著語言特性的增加,新手需要學習的知識日益繁多。
- 社群變遷:起初友好的社群隨著使用者的增多面臨更激烈的競爭與意見分歧。
- 缺乏異步運行時:導致開發者在實現異步處理時的困難。

🔖 Keywords: #Rust #程式語言 #複雜性 #社群 #錯誤處理

My negative views on Rust

🌘 Rust 錯誤處理其實很完美 — Bitfield Consulting
➤ Option 和 Result 型別在 Rust 語言中的靈活應用
https://bitfieldconsulting.com/posts/rust-errors-option-result
Rust 提供了 Option 和 Result 兩種型別,用來處理可能的無資料或錯誤情況。透過簡潔的語法像?操作符和unwrap方法,優雅解決了這些問題。
+ 真是講解得非常清楚易懂,對於 Rust 的錯誤處理機制有更深入的理解。
+ 這篇文章對於 Rust 語言獨特的特性進行了生動的比較和詳細解說,讓人對 Rust 的設計理念有更深入的認識。
#Rust #錯誤處理
Rust error handling is perfect actually — Bitfield Consulting

The night is dark and full of errors, so how should we handle these gracefully and safely in our Rust programs? Let’s introduce two of every Rust programmer’s favourite types: Option and Result.

Bitfield Consulting
🌘 隊員錯誤和errors.Is()將您的代碼速度減少了3000% | DoltHub博客
➤ 不同策略的錯誤處理性能測試結果
https://www.dolthub.com/blog/2024-05-31-benchmarking-go-error-handling/
在這篇博客文章中,我們對在Go語言中處理錯誤的不同策略進行了基準測試,並討論了它們的性能和其他優劣。我們發現使用sentinel error模式結合errors.Is()會導致代碼速度下降約30倍,這一結果令我們感到震驚。我們將分享這些結果並進行深入討論。
+ 這篇文章很好地分析了不同的錯誤處理策略對代碼性能的影響,對於開發Go語言的人來說非常有價值。
+ 從這篇文章中我深切感受到了對代碼性能進行測試的重要性,期待更多類似的實踐和經驗分享。
#Golang #錯誤處理 #性能測試
Sentinel errors and errors.Is() slow your code down by 500%

An exhaustive set of benchmarks on different ways to approach error handling in Golang. We demonstrate that common sentinel error idioms are slow your code down by 5x.