Go初級之十:錯誤處理與程序健壯性

Go初級之十:錯誤處理與程序健壯性

為什么選這個主題?

  • 錯誤處理是 Go 語言中一個非常獨特且重要的設計哲學。
  • 它體現了 Go 的“顯式錯誤處理”思想,與其它語言(如 Java/Python)的異常機制不同。
  • 在實際開發中,幾乎每個項目都離不開對錯誤的處理。
  • 這個主題能很好銜接前面講過的函數、返回值、結構體等知識,并為后續進階打下基礎。

📝 文章大綱建議:

一、引言:為什么要重視錯誤處理?
  • 寫代碼不是為了“不出錯”,而是要“優雅地應對錯誤”。
  • Go 不使用異常(Exception),而是通過 error 類型顯式返回錯誤。
  • 比較其他語言 vs Go 的錯誤處理方式(比如 Java 拋出異常 vs Go 返回 error)。
二、Go 中的 error 接口
type error interface {Error() string
}
  • 所有自定義錯誤類型必須實現 Error() 方法。
  • 示例:
func divide(a, b int) (int, error) {if b == 0 {return 0, errors.New("division by zero")}return a / b, nil
}
三、標準庫中的 errors
  • errors.New("xxx") 創建簡單錯誤。
  • fmt.Errorf("format %v", args) 更靈活地構造錯誤信息。
  • 使用 errors.Is()errors.As() 判斷錯誤類型(Go 1.13+)。
四、自定義錯誤類型
  • 實現 error 接口的結構體:
type MyError struct {Code    intMessage string
}func (e *MyError) Error() string {return fmt.Sprintf("Code: %d, Msg: %s", e.Code, e.Message)
}
五、錯誤包裝與上下文(Error Wrapping)
  • 使用 fmt.Errorf("... %w ...", err) 包裝錯誤(Go 1.13+)。
  • 例子:調用外部 API 失敗時保留原始錯誤信息。
  • 如何用 errors.Unwrap() 解包。
六、最佳實踐
  1. 不要忽略錯誤!

    // ? 錯誤做法
    _, err := os.Open("file.txt")
    // 忽略 err...// ? 正確做法
    file, err := os.Open("file.txt")
    if err != nil {log.Fatal("無法打開文件:", err)
    }
    
  2. 合理返回錯誤,而不是 panic

    • panic 是用于嚴重問題(如邏輯錯誤),不是普通錯誤處理手段。
    • 應該優先用 return value, error 模式。
  3. 避免重復檢查相同錯誤

    • 可以封裝通用錯誤處理函數。
  4. 記錄日志 + 返回錯誤

    • 日志只用于調試或監控,不替代錯誤處理。
七、實戰小練習

給出一個小任務,例如:

編寫一個函數 ReadConfig(path string),嘗試讀取配置文件,解析 JSON 并返回結構體。要求:

  • 如果文件不存在,返回 os.ErrNotExist
  • 如果解析失敗,返回自定義錯誤 ParseError
  • 使用 fmt.Errorf 包裝原始錯誤
  • 調用方需正確處理所有可能的錯誤情況
八、總結:從“不會錯”到“不怕錯”
  • Go 的錯誤處理哲學是“讓錯誤可見、可控、可追蹤”。
  • 顯式處理錯誤雖然繁瑣,但能極大提升程序的健壯性和可維護性。
  • 掌握了錯誤處理,你就真正邁入了“工程化編程”的門檻。

🔚 結語

“我們不能阻止 bug 的出現,但我們可以優雅地面對它們。”
—— 一位 Go 開發者的心聲

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921317.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921317.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Xsens解碼人形機器人訓練的語言

隨著人形機器人在現實世界的應用中變得越來越普遍,了解實現其類似人類運動的技術至關重要。在Xsens我們滿懷熱情地探索這一領域,致力于為人形機器人訓練開發最佳的動作捕捉解決方案。為了幫助您更好地理解所遇到的術語,我們創建了一份概述&am…

25年下載chromedriver.140

前提: 因為我需要用seleium模擬瀏覽器獲取數據,需要用到這個chromedriver 驅動。 1.chrome瀏覽器版本號 先檢查你的chrome 的版本號是多少,就下載對應的 chromedriver 【三個點】--->【幫助】------>【關于 Google chrome 】 我的版本…

深度學習玩游戲, 模型玩游戲,大模型+游戲 llm+game, 機器學習玩游戲,人工智能游戲陪伴,模型陪玩游戲

1. 論文地址 Think in Games: Learning to Reason in Games via Reinforcement Learning with Large Language Models 2. 中文: Think in Games:做一個在王者榮耀中會玩和思考的Agent 3. 我記得幾年前,相關文章還是使用dqn算法。玩雅利達小…

并查集|棧

lc1668不能直接跳class Solution { public:int maxRepeating(string sequence, string word) {int k 0, n sequence.size(), wn word.size(), t 0;for (int i 0; i < n - wn; i) {if (sequence.substr(i, wn) word) {t 1;int j i wn;while (j wn < n &&…

問題三ai思路

好的&#xff0c;我把“路線A&#xff1a;分類建模擇時”的代碼按功能分段給出&#xff0c;并為每段配上簡明解釋。你可以將這些段落依次粘貼到已完成清洗后的 df 變量之后直接運行。 0. 依賴導入&#xff08;一次即可&#xff09; 作用&#xff1a;導入所需庫&#xff1b;后續…

Java第十四幕集合啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦

集合1 Collection接口1.1 集合概述集合是一個裝對象的容器。集合中只能存放引用數據類型的對象。集合中有一些大小是固定的&#xff0c;有一些是不固定的。有一些是有序的&#xff0c;有些是無序的。有些可以有重復元素&#xff0c;有一些不可以有重復元素1.2 集合常用方法publ…

硬件基礎:串口通信

數據傳輸方式&#xff08;按位傳輸方式&#xff09;并行通信通過多條數據線同時傳輸多個數據位&#xff0c;速度較快但成本高&#xff0c;抗干擾能力弱&#xff0c;適用于短距離通信&#xff0c;如早期的打印機接口。串行通信通過單條或少數數據線逐位傳輸數據&#xff0c;線路…

從Java全棧到云原生:一場技術深度對話

從Java全棧到云原生&#xff1a;一場技術深度對話 面試官與應聘者互動記錄 面試官&#xff1a;你好&#xff0c;歡迎來到我們的面試。先簡單介紹一下你自己吧。 應聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;28歲&#xff0c;碩士學歷&#xff0c;有5年Java全棧開發…

158-EEMD-HHT算法

158-EEMD-HHT#EMD #希爾伯特變換-&#xff08;Hilbert- Huang Transform&#xff0c;HHT&#xff09;#集合經驗模態分解 EEMD #時頻分析 #邊際譜代碼描述1、利用 集合經驗模態分解&#xff08;EEMD&#xff09;方法對信號進行分解&#xff0c;得到模態分量 IMF&#xff1b;2、計…

C#開發中的 token

C# 開發中的 Token 詳解 C# 開發中的 Token 詳解與示例 1. CancellationToken - 異步取消令牌 示例 1:基礎取消機制 示例 2:Web API 中的請求取消 2. JWT Token - 身份驗證令牌 示例 1:JWT Token 生成與驗證 示例 2:ASP.NET Core JWT 認證配置 3. Access Token - API 訪問令…

旅游安全急救實訓室助力應急處置技能實戰化

隨著旅游行業的快速發展&#xff0c;游客安全需求日益突出&#xff0c;應急處置能力已成為旅游服務人才的核心素養之一。在中職教育旅游服務與管理專業中&#xff0c;旅游安全急救實訓室作為關鍵教學場所&#xff0c;正發揮著不可替代的作用。一、旅游安全急救實訓室的建設背景…

分布式微服務--ZooKeeper的客戶端常用命令 Java API 操作

一、ZooKeeper 客戶端常用命令 1. 啟動與退出 bin/zkCli.sh -server 127.0.0.1:2181 # 連接客戶端 quit # 退出客戶端2. 節點操作 # 查看子節點 ls / ls -s / ls /app# 查看節點詳細信息 ls2 /app stat /app# 創建節點 create /node1 "…

PID控制技術深度剖析:從基礎原理到高級應用(六)

PID 控制技術深度剖析&#xff1a;從基礎原理到高級應用 最近在項目中有要開始進行PID的控制了&#xff0c;隔了很久沒有做PID控制的東西了&#xff0c;所以想正好借這個機會&#xff0c;溫習一下和PID有關的內容。 系列文章目錄 PID控制技術深度剖析&#xff1a;從基礎原理到…

PCL關鍵點提取

1. 核心概念:什么是關鍵點?為什么需要關鍵點? 關鍵詞:信息冗余、計算效率、突出特征 “想象一下,我們有一片密集的點云,包含幾十萬個點。如果我們直接在每個點上都計算像FPFH這樣的局部特征,計算量會非常大,極其耗時,而且很多點所處的區域(比如平坦的墻面)特征非常…

vcruntime140_1.dll缺失怎么辦?暗黑破壞神游戲vcruntime140_1.dll缺失的4個解決方法

你是否遇到過這樣的情況&#xff1a; 玩《暗黑破壞神》《英雄聯盟》《GTA5》的時候&#xff0c;游戲忽然閃退&#xff0c;彈窗提示&#xff1a; “無法啟動&#xff0c;因為計算機中丟失 vcruntime140_1.dll” 這不是某一個游戲的問題&#xff0c;而是 Windows 系統運行庫缺失…

遷移學習-ResNet

好的&#xff0c;我將為你撰寫一篇關于ResNet遷移學習的技術博客。以下是博客的主要內容&#xff1a;ResNet遷移學習&#xff1a;原理、實踐與效果深度解析1. 深度學習中遷移學習的重要性與ResNet的獨特價值遷移學習&#xff08;Transfer Learning&#xff09;是機器學習中一種…

極大似然估計與概率圖模型:統計建模的黃金組合

在數據驅動的時代&#xff0c;如何從海量信息中提取有價值的規律&#xff1f;統計建模提供了兩大核心工具&#xff1a;極大似然估計&#xff08;MLE&#xff09;幫助我們根據數據推斷模型參數&#xff0c;而概率圖模型&#xff08;PGM&#xff09;則通過圖形化語言描述變量間的…

解析豆科系統發育沖突原因

生命之樹是進化生物學的核心&#xff0c;但由于 不完全譜系排序&#xff08;ILS&#xff09;、雜交 和 多倍化 等復雜過程&#xff0c;解析深層且難解的系統發育關系仍然是一個挑戰。**豆科&#xff08;Leguminosae&#xff09;**這一物種豐富且生態多樣化家族的理解&#xff0…

從Java全棧到前端框架:一次真實的面試對話與技術解析

從Java全棧到前端框架&#xff1a;一次真實的面試對話與技術解析 在一次真實的面試中&#xff0c;一位擁有多年經驗的Java全棧開發工程師&#xff0c;被問及了多個涉及前后端技術棧的問題。他的回答既專業又自然&#xff0c;展現了扎實的技術功底和豐富的實戰經驗。 面試官&…

阿瓦隆 A1566HA 2U 480T礦機參數解析:性能與能效深入分析

在礦機行業&#xff0c;AvaLON是一個備受關注的品牌&#xff0c;尤其在比特幣&#xff08;BTC&#xff09;和比特幣現金&#xff08;BCH&#xff09;挖礦領域&#xff0c;憑借其強勁的算力和高效能效&#xff0c;在市場中占據了一席之地。本文將針對阿瓦隆 A1566HA 2U 480T礦機…