成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go語言的有效錯誤處理

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

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

一、簡介

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

二、在縮進區處理錯誤

當使用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是什么。如果你設計實現的包會因某種原因發生某種錯誤,你的包用戶將會對錯誤的原因很感興趣。為了滿足用戶的需求,你需要實現error接口,簡單做起來就像這樣:

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

現在,你的包用戶通過執行一個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,上面這段代碼將無法知道是由于網絡問題導致的失敗,會繼續使用這條無效的鏈接。

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

四、將錯誤作為狀態

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

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

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

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

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

  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.     } 

優化后的實現方法如下:

  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

2025-06-06 06:45:54

2021-09-13 07:53:31

Go錯誤處理

2022-09-05 08:55:15

Go2提案語法

2021-09-27 15:33:48

Go 開發技術

2023-10-26 15:49:53

Go日志

2020-12-17 06:25:05

Gopanic 模式

2021-09-27 23:28:29

Go多協程并發

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

2022-08-01 08:48:39

Go代碼接口

2023-12-26 22:05:53

并發代碼goroutines
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 综合二区 | 偷拍自拍第一页 | 天天看夜夜 | 91免费看片| 亚洲精品9999久久久久 | 国产在线第一页 | 国产精品免费小视频 | 国产成人精品久久二区二区91 | 成人精品视频在线观看 | 欧美a级成人淫片免费看 | 亚洲一区欧美 | 日韩欧美在线观看视频 | 另类专区亚洲 | 日韩免费一区二区 | 成人欧美一区二区三区色青冈 | 国产日韩精品一区二区 | 欧美一级精品片在线看 | 久久久久久久久久久久久九 | 久久免费精品 | 偷拍亚洲色图 | 美女在线观看国产 | 黄色在线观看网站 | 五月综合激情婷婷 | 爱爱视频日本 | 91玖玖 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 久久精品国产久精国产 | 日韩h| 毛片免费观看 | 91精品国产综合久久久久久丝袜 | 天天射天天操天天干 | 国产精品久久久久久亚洲调教 | 女同久久另类99精品国产 | 91欧美激情一区二区三区成人 | 爱爱爱av | 成人日韩av | 国产一级片av | 91久久国产综合久久91精品网站 | 91精品国产91| 欧美日韩国产高清 | 日本a v在线播放 |