国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go語言的有效錯誤處理

開發(fā) 前端
中午閑暇翻看Daniel Morsing的“The Go scheduler”時,發(fā)現其另外一篇短文“Effective error handling in Go”,文章不長,但感覺對Go中錯誤處理方法總結的還是比較到位的,這里譯之供大家參考。

中午閑暇翻看Daniel Morsing的“The Go scheduler”時,發(fā)現其另外一篇短文“Effective error handling in Go”,文章不長,但感覺對Go中錯誤處理方法總結的還是比較到位的,這里譯之供大家參考。

一、簡介

Go語言受到詬病最多的一項就是其錯誤處理機制。如果顯式地檢查和處理每個error,這恐怕的確會讓人望而卻步。你可以試試這里列出的幾個方法,以避免你走入錯誤處理方法的誤區(qū)當中去。

二、在縮進區(qū)處理錯誤

當使用Go語言編寫代碼時,***下面這樣的錯誤處理方法:

  1. f, err := os.Open(path) 
  2. if err != nil { 
  3.     // handle error 
  4. // do stuff 
  5.  
  6. 而不是下面這樣的: 
  7.  
  8. f, err := os.Open(path) 
  9. if err == nil { 
  10.     // do stuff 
  11. // handle error 

按照上面的方法處理錯誤,處理正常情況的代碼讀起來就顯得通篇連貫了。

三、定義你自己的errors

做好如何正確進行錯誤處理的***步就是要了解error是什么。如果你設計實現的包會因某種原因發(fā)生某種錯誤,你的包用戶將會對錯誤的原因很感興趣。為了滿足用戶的需求,你需要實現error接口,簡單做起來就像這樣:

  1. type Error string 
  2. func (e Error) Error() string { return string(e) } 

現在,你的包用戶通過執(zhí)行一個type assertion就可以知道是否是你的包導致了這個錯誤:

  1. result, err := yourpackage.Foo() 
  2. if ype, ok := err.(yourpackage.Error); ok { 
  3.     // use ype to handle error 

通過這個方法,你還可以向你的包用戶暴露更多地結構化錯誤信息:

  1. type ParseError struct { 
  2.     File  *File 
  3.     Error string 
  4.  
  5. func (oe *ParseError) Error() string {//譯注:原文中這里是OpenError 
  6.     // format error string here 
  7.  
  8. func ParseFiles(files []*File) error { 
  9.     for _, f := range files { 
  10.         err := f.parse() 
  11.         if err != nil { 
  12.             return &ParseError{ //譯注:原文中這里是OpenError 
  13.                 File:  f, 
  14.                 Error: err.Error(), 
  15.             } 
  16.         } 
  17.     } 

通過這種方法,你的用戶就可以明確地知道到底哪個文件出現解析錯誤了。(譯注:從這里看到的go語言error設計之內涵,讓我想起了Rob Pike大神的一篇Blog:"少即是級數級的多")

不過包裝error時要小心,當你將一個error包裝起來后,你可能會丟失一些信息:

  1. var c net.Conn 
  2. f, err := DownloadFile(c, path) 
  3. switch e := err.(type) { 
  4. default
  5.     // this will get executed if err == nil 
  6. case net.Error: 
  7.     // close connection, not valid anymore 
  8.     c.Close() 
  9.     return e 
  10. case error: 
  11.     // if err is non-nil 
  12.     return err 
  13. // do other things. 

如果你包裝了net.Error,上面這段代碼將無法知道是由于網絡問題導致的失敗,會繼續(xù)使用這條無效的鏈接。

有一條經驗規(guī)則:如果你的包中使用了一個外部interface,那么不要對這個接口中方法返回的任何錯誤,使用你的包的用戶可能更關心這些錯誤,而不是你包裝后的錯誤。

四、將錯誤作為狀態(tài)

有時,當遇到一個錯誤時,你可能會停下來等等。這或是因為你將延遲報告錯誤,又或是因為你知道如果這次報告后,后續(xù)你會再報告同樣的錯誤。

***種情況的一個例子就是bufio包。當一個bufio.Reader遇到一個錯誤時,它將停下來保持這個狀態(tài),直到buffer已經被清空。只有在那時它才會報告錯誤。

第二種情況的一個例子是go/loader。當你通過某些參數調用它導致錯誤時,它會停下來保持這個狀態(tài),因為它知道你很可能會使用同樣地參數再次調用它。

五、使用函數以避免重復代碼

如果你有兩段重復的錯誤處理代碼,你可以將它們放到一個函數中去:

  1. func handleError(c net.Conn, err error) { 
  2.     // repeated error handling 
  3.  
  4. func DoStuff(c net.Conn) error { 
  5.     f, err := downloadFile(c, path) 
  6.     if err != nil { 
  7.         handleError(c, err) 
  8.         return err 
  9.     } 
  10.  
  11.     f, err := doOtherThing(c) 
  12.     if err != nil { 
  13.         handleError(c, err) 
  14.         return err 
  15.     } 

優(yōu)化后的實現方法如下:

  1. func handleError(c net.Conn, err error) { 
  2.     if err == nil { 
  3.         return 
  4.     } 
  5.     // repeated error handling 
  6.  
  7. func DoStuff(c net.Conn) error { 
  8.     defer func() { handleError(c, err) }() 
  9.     f, err := downloadFile(c, path) 
  10.     if err != nil { 
  11.         return err 
  12.     } 
  13.  
  14.     f, err := doOtherThing(c) 
  15.     if err != nil { 
  16.         return err 
  17.     } 

這就是全部了。就Go語言錯誤處理而言,我知道的就這么多了。

責任編輯:張偉 來源: Tony Bai的博客
相關推薦

2021-04-29 09:02:44

語言Go 處理

2025-03-31 00:29:44

2021-09-13 07:53:31

Go錯誤處理

2025-06-06 06:45:54

2022-09-05 08:55:15

Go2提案語法

2025-09-05 01:55:00

Go并發(fā)錯誤項目

2025-06-30 09:49:11

2020-12-17 06:25:05

Gopanic 模式

2023-10-26 15:49:53

Go日志

2021-09-27 15:33:48

Go 開發(fā)技術

2021-09-27 23:28:29

Go多協(xié)程并發(fā)

2021-09-27 10:04:03

Go程序處理

2017-09-22 15:25:40

Go語言其他語言錯誤處理

2021-04-14 07:08:14

Nodejs錯誤處理

2023-03-10 08:48:29

2024-03-27 08:18:02

Spring映射HTML

2024-02-28 08:54:57

switchGo錯誤

2022-06-26 23:03:14

Go標準庫語言

2022-07-13 08:53:28

函數Go語言

2025-02-24 09:30:15

點贊
收藏

51CTO技術棧公眾號

欧美黑人经典片免费观看| 久久精品视频网| 欧美大肚乱孕交hd孕妇| 色乱码一区二区三区熟女| 老汉色老汉首页av亚洲| 午夜精品久久久久久久久久| 自拍偷拍99| 国产欧美日韩精品一区二区三区| 日韩欧美国产午夜精品| 国产精品三级a三级三级午夜| 麻豆成人av在线| 国产精品男人爽免费视频1| av资源中文在线| 欧美天天综合色影久久精品| 欧美精品无码一区二区三区| 美女精品一区二区| 亚洲一区久久久| 天海翼亚洲一区二区三区| 日韩国产在线播放| 欧美性猛交xxx乱大交3蜜桃| 亚洲不卡av一区二区三区| 亚洲熟妇无码一区二区三区| 欧美a一区二区| 成人三级视频在线观看一区二区| 网曝91综合精品门事件在线| 欧美激情视频播放| 成人在线爆射| 亚洲香蕉在线观看| 日本黄色一区| 亚洲欧美综合v| 99久久婷婷国产综合精品首页 | 91亚洲精品一区| 操欧美女人视频| 欧美国产一区二区三区| jvid福利在线一区二区| 97超级碰在线看视频免费在线看 | 国产精品av一区二区| 成人深夜直播免费观看| 国产精品久久久久久久久妇女| 国产大片精品免费永久看nba| 欧美精品乱码| 国产午夜精品在线| 日本不卡一区二区三区高清视频| 免费不卡亚洲欧美| 青青草精品视频| 男人揉女人奶房视频60分 | 搡老女人一区二区三区视频tv| 日本欧美韩国| 55夜色66夜色国产精品视频| 亚洲人体大胆视频| 黄色一级片黄色| 天天操天天色综合| 国产盗摄在线视频网站| 欧美国产视频一区二区| 欧美精品午夜| 91淫黄看大片| 日韩一区二区三区在线| 影音先锋欧美激情| 精品高清视频| 亚洲大型综合色站| 男人天堂视频在线观看| 国产欧美日韩专区发布| 国内精品国产成人| h视频网站在线观看| 欧美激情视频在线| 免费视频一区| 一区二区三区四区在线免费视频| 亚洲国产日韩欧美在线图片| 日韩一区二区中文| 亚洲人成无码www久久久| 91精品国产色综合久久ai换脸 | 日韩美女一区二区三区| 午夜精品久久99蜜桃的功能介绍| 在线精品日韩| 欧美日韩小视频| 中文乱码字幕高清在线观看| 在线观看久久久久久| 欧美aaaaaa午夜精品| 91香蕉国产在线观看| 亚洲免费成人av| youjizz亚洲| 日本最黄视频| 欧美在线视频一区二区| 国产精品成人一区二区艾草| 风间由美性色一区二区三区四区| 韩日视频在线观看| 亚洲欧美制服中文字幕| 国产精品影视天天线| 精品免费av一区二区三区| 经典三级在线视频| 日韩在线视频网站| 不卡av免费在线观看| 欧洲激情综合| 国产三级视频在线播放线观看| 日韩美女视频免费在线观看| 国产精品美女久久福利网站| 精品大片一区二区| 黄色在线网站| 日本一区二区三区在线视频| 精品视频偷偷看在线观看| 99久久精品情趣| 凹凸成人精品亚洲精品密奴| 99青草视频在线播放视| 青青草视频在线视频| 欧美日韩aaaa| 亚洲成a人v欧美综合天堂下载| 国产日韩一区| 久久免费影院| av男人的天堂网| 农村寡妇一区二区三区| 色哟哟入口国产精品| 视频91a欧美| 成年人免费在线视频| 国产精品视频分类| 日本欧美色综合网站免费| 91精品国产自产91精品| 欧美精品欧美精品系列| 欧美激情一区二区三区不卡| 韩国欧美一区| 豆花视频一区| 91av久久| 国产在线网站| 99视频入口| 亚洲AV无码成人精品一区| 91精品国产高清久久久久久| 日韩免费视频一区| 亚洲一区二区三区中文字幕| 国产一区二区91| 好吊视频一区二区三区四区| 国产精品自在| 国产一区二区三区四区五区3d| 麻豆av电影在线观看| 天天干天天综合| 伊人再见免费在线观看高清版 | 蜜桃av一区二区| 在线看片不卡| 美女亚洲一区| 24小时成人在线视频| 欧美日韩精品免费观看视完整| 日韩三级免费| 18网站在线观看| 理论片在线观看理伦片| 国产美女被遭强高潮免费网站| jizzjizzxxxx| 狠狠干 狠狠操| r级无码视频在线观看| 一二三在线视频| 91制片厂免费观看| 中文字幕色呦呦| 日本欧美黄色片| 成人片在线播放| 成人做爰高清视频网站| 成人www视频网站免费观看| 亚洲娇小娇小娇小| 久久99久久99精品中文字幕| 97视频在线观看视频免费视频| 色综合色综合网色综合| 午夜精品理论片| 国产中文字幕91| 久久99精品久久久久久久久久 | 538prom精品视频线放| 亚洲精品99久久久久| 一个色综合导航| 欧美激情综合色综合啪啪五月| 26uuu另类亚洲欧美日本一| 国产欧美日韩中文| 一区二区三区欧美成人| 欧美一级欧美一级| 爱草在线视频| 日本中文在线| 欧美经典一区| 亚洲国产精品一区| 成人国产电影网| 亚洲精品成人在线| 亚洲精品xxxx| 美日韩精品免费视频| 福利视频一区二区三区| 人妻久久久一区二区三区| 亚洲私人影吧| 9999在线精品视频| 日日摸夜夜添夜夜添亚洲女人| 91农村精品一区二区在线| 欧美日韩亚洲国产一区| 在线视频中文亚洲| 精品伦精品一区二区三区视频| 欧美黑人经典片免费观看| 日本三级韩国三级欧美三级| 一区二区在线免费播放| 国产欧美日韩一区二区三区在线| 91麻豆国产精品久久| 亚洲色图15p| 视频一区二区精品| 丁香在线视频| 狠狠操综合网| 亚洲免费色视频| 欧美激情精品久久久久久大尺度| 天堂av在线中文| 青春草在线免费视频| 中文字幕一区二区三区久久网站| 亚洲国产精品高清|