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

Go語言的有效錯誤處理

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

中午閑暇翻看Daniel Morsing的“The Go scheduler”時,發(fā)現(xiàn)其另外一篇短文“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是什么。如果你設計實現(xiàn)的包會因某種原因發(fā)生某種錯誤,你的包用戶將會對錯誤的原因很感興趣。為了滿足用戶的需求,你需要實現(xiàn)error接口,簡單做起來就像這樣:

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

現(xiàn)在,你的包用戶通過執(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.     } 

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

不過包裝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,上面這段代碼將無法知道是由于網(wǎng)絡問題導致的失敗,會繼續(xù)使用這條無效的鏈接。

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

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

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

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

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

五、使用函數(shù)以避免重復代碼

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

  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)化后的實現(xiàn)方法如下:

  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 開發(fā)技術

2023-10-26 15:49:53

Go日志

2020-12-17 06:25:05

Gopanic 模式

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

函數(shù)Go語言

2025-02-24 09:30:15

2022-08-01 08:48:39

Go代碼接口

2023-12-26 22:05:53

并發(fā)代碼goroutines
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线激情视频 | 特级黄色毛片 | 国产精品综合色区在线观看 | 91精品国产91久久久久久丝袜 | 午夜精品视频 | 91免费高清视频 | 亚洲精品1区| 一级片免费视频 | 日本a在线 | 国产一级片一区二区 | 国产精品高潮呻吟久久 | 久久精品亚洲欧美日韩久久 | 在线日韩精品视频 | 欧美日韩亚洲国产 | 日日摸夜夜添夜夜添精品视频 | 欧美自拍网站 | 成年人网站国产 | 欧美在线视频一区二区 | 91不卡| 日韩精品在线看 | 午夜免费 | 国产福利在线视频 | 最新中文字幕在线播放 | 亚洲欧美在线观看 | xxxxx免费视频 | 国精产品一区一区三区免费完 | 婷婷午夜天 | 在线观看免费高清av | 欧美性生活一区二区三区 | 欧美久久一区二区 | 亚洲成av人片在线观看 | 免费一级欧美在线观看视频 | 国产精品久久一区二区三区 | 国产精品免费一区二区三区四区 | 日韩欧美一区二区三区免费观看 | 日韩伦理一区二区 | 亚洲欧洲精品在线 | 91精品国产91久久久久久 | 真人一级毛片 | 国产精品久久久久一区二区三区 | www.日韩|