日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

要么返回錯誤值,要么輸出日志,別兩樣都做

來源: 責(zé)編: 時(shí)間:2024-04-15 18:12:13 171觀看
導(dǎo)讀1. 緣起這周,一個產(chǎn)品團(tuán)隊(duì)內(nèi)進(jìn)行Go代碼評審時(shí),得到了一個結(jié)論:所有的if err != nil的地方都應(yīng)該輸出錯誤日志。然而,這種做法并不是最佳實(shí)踐,它存在一些問題。首先,打印過多的錯誤日志會導(dǎo)致日志文件變得冗長和難以閱讀。其

1. 緣起

這周,一個產(chǎn)品團(tuán)隊(duì)內(nèi)進(jìn)行Go代碼評審時(shí),得到了一個結(jié)論:所有的if err != nil的地方都應(yīng)該輸出錯誤日志。然而,這種做法并不是最佳實(shí)踐,它存在一些問題。afA28資訊網(wǎng)——每日最新資訊28at.com

首先,打印過多的錯誤日志會導(dǎo)致日志文件變得冗長和難以閱讀。其次,重復(fù)的錯誤信息會增加冗余。此外,每一層都打印錯誤日志,一旦錯誤信息設(shè)計(jì)不當(dāng),可能會導(dǎo)致上下文信息的丟失。afA28資訊網(wǎng)——每日最新資訊28at.com

讓我們來看一個示例,說明為什么同時(shí)輸出錯誤日志和返回錯誤值會導(dǎo)致問題。假設(shè)我們有一個五層的Go函數(shù)調(diào)用棧,其中最底層的函數(shù)level4Function出現(xiàn)了一個錯誤:afA28資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "fmt" "log")func main() { if err := topFunction(); err != nil {  log.Printf("Error: %v", err) }}func topFunction() error { err := level1Function() if err != nil {  log.Printf("topFunction: %v", err)  return err } return nil}func level1Function() error { err := level2Function() if err != nil {  log.Printf("level1Function: %v", err)  return err } return nil}func level2Function() error { err := level3Function() if err != nil {  log.Printf("level2Function: %v", err)  return err } return nil}func level3Function() error { err := level4Function() if err != nil {  log.Printf("level3Function: %v", err)  return err } return nil}func level4Function() error { err := fmt.Errorf("something went wrong") log.Printf("level4Function: %v", err) return err}

在這個示例中,我們在每個函數(shù)中都輸出錯誤日志并返回錯誤值。我們運(yùn)行一下這個程序:afA28資訊網(wǎng)——每日最新資訊28at.com

$go run main.go 2024/04/14 23:10:05 level4Function: something went wrong2024/04/14 23:10:05 level3Function: something went wrong2024/04/14 23:10:05 level2Function: something went wrong2024/04/14 23:10:05 level1Function: something went wrong2024/04/14 23:10:05 topFunction: something went wrong2024/04/14 23:10:05 Error: something went wrong

當(dāng)我們運(yùn)行程序時(shí),日志文件會出現(xiàn)重復(fù)的錯誤信息,并且上下文信息不易于進(jìn)行鏈?zhǔn)阶粉櫍驗(yàn)槊總€函數(shù)只打印了特定錯誤的信息,而沒有提供之前錯誤的上下文。afA28資訊網(wǎng)——每日最新資訊28at.com

2. 好的實(shí)踐技巧

為了解決上述問題,我們需要采用一種更好的實(shí)踐方法。面向調(diào)用層次較深的函數(shù)調(diào)用棧,我們應(yīng)該只在最頂層的函數(shù)中輸出錯誤日志,而在下層函數(shù)中返回錯誤值。但是,我們需要精心構(gòu)造錯誤值,以形成基于wrapped error的錯誤鏈。afA28資訊網(wǎng)——每日最新資訊28at.com

讓我們修改示例代碼,按照最佳實(shí)踐進(jìn)行錯誤處理:afA28資訊網(wǎng)——每日最新資訊28at.com

package mainimport ( "fmt" "log")func main() { if err := topFunction(); err != nil {  log.Printf("Error: %v", err) }}func topFunction() error { err := level1Function() if err != nil {  return fmt.Errorf("topFunction: %w", err) } return nil}func level1Function() error { err := level2Function() if err != nil {  return fmt.Errorf("level1Function: %w", err) } return nil}func level2Function() error { err := level3Function() if err != nil {  return fmt.Errorf("level2Function: %w", err) } return nil}func level3Function() error { err := level4Function() if err != nil {  return fmt.Errorf("level3Function: %w", err) } return nil}func level4Function() error { err := fmt.Errorf("something went wrong") return fmt.Errorf("level4Function: %w", err)}

在這個修改后的示例中,我們在每個函數(shù)中使用fmt.Errorf+%w將錯誤包裝為一個wrapped error,并將前一層的錯誤作為參數(shù)傳遞。通過這種方式,我們構(gòu)建了一個錯誤鏈,其中每個錯誤都包含了之前發(fā)生的錯誤上下文。在最頂層的main函數(shù)中,我們使用日志庫輸出錯誤日志,下面是示例程序的運(yùn)行結(jié)果:afA28資訊網(wǎng)——每日最新資訊28at.com

2024/04/14 23:12:16 Error: topFunction: level1Function: level2Function: level3Function: level4Function: something went wrong

我們看到:通過這種方法,我們避免了重復(fù)的錯誤日志,并保留了錯誤的上下文信息,快速定位了根因。當(dāng)運(yùn)行修改后的程序時(shí),我們會看到日志文件中只打印了完整的錯誤鏈,而不是重復(fù)的錯誤信息。通過調(diào)用鏈和精心設(shè)計(jì)的錯誤上下文,我們還可以看到函數(shù)調(diào)用鏈,這使得錯誤的調(diào)試和處理變得更加方便和可靠。afA28資訊網(wǎng)——每日最新資訊28at.com

3. 小結(jié)

在前面的示例中,我們展示了同時(shí)輸出錯誤日志和返回錯誤值的問題,并介紹了如何使用wrapped error來構(gòu)建錯誤鏈。通過合理地處理錯誤,我們可以提高代碼的可讀性和可維護(hù)性,同時(shí)也有助于快速定位和解決問題。afA28資訊網(wǎng)——每日最新資訊28at.com

總之,在編寫Go代碼時(shí),請記住要么返回錯誤值,要么輸出日志,不要兩者都做。通過合理地處理錯誤,我們可以編寫出更可靠、更易于調(diào)試的代碼。afA28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-83619-0.html要么返回錯誤值,要么輸出日志,別兩樣都做

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 從 React 新官網(wǎng)學(xué)到的一個優(yōu)秀實(shí)踐妙招

下一篇: 不要在循環(huán)await啦,異步操作的六個最佳實(shí)踐!

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 潮安县| 开阳县| 磐安县| 蚌埠市| 洞口县| 德庆县| 阿拉善右旗| 沙田区| 周宁县| 长子县| 盐边县| 育儿| 东至县| 德惠市| 获嘉县| 博客| 南陵县| 长乐市| 营口市| 衢州市| 肇东市| 德化县| 齐河县| 定陶县| 皋兰县| 边坝县| 天柱县| 宝兴县| 锦屏县| 枣庄市| 鹰潭市| 习水县| 磐安县| 兴仁县| 静乐县| 米林县| 综艺| 池州市| 原阳县| 西平县| 宜宾市|