日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Go語言的有效錯(cuò)誤處理

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

創(chuàng)新互聯(lián)建站于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元開福做網(wǎng)站,已為上家服務(wù),為開福各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

一、簡介

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

二、在縮進(jìn)區(qū)處理錯(cuò)誤

當(dāng)使用Go語言編寫代碼時(shí),***下面這樣的錯(cuò)誤處理方法:

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

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

三、定義你自己的errors

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

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

現(xiàn)在,你的包用戶通過執(zhí)行一個(gè)type assertion就可以知道是否是你的包導(dǎo)致了這個(gè)錯(cuò)誤:

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

通過這個(gè)方法,你還可以向你的包用戶暴露更多地結(jié)構(gòu)化錯(cuò)誤信息:

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

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

不過包裝error時(shí)要小心,當(dāng)你將一個(gè)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. }
  14. // do other things.

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

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

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

有時(shí),當(dāng)遇到一個(gè)錯(cuò)誤時(shí),你可能會停下來等等。這或是因?yàn)槟銓⒀舆t報(bào)告錯(cuò)誤,又或是因?yàn)槟阒廊绻@次報(bào)告后,后續(xù)你會再報(bào)告同樣的錯(cuò)誤。

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

第二種情況的一個(gè)例子是go/loader。當(dāng)你通過某些參數(shù)調(diào)用它導(dǎo)致錯(cuò)誤時(shí),它會停下來保持這個(gè)狀態(tài),因?yàn)樗滥愫芸赡軙褂猛瑯拥貐?shù)再次調(diào)用它。

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

如果你有兩段重復(fù)的錯(cuò)誤處理代碼,你可以將它們放到一個(gè)函數(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.     f, err := doOtherThing(c)
  11.     if err != nil {
  12.         handleError(c, err)
  13.         return err
  14.     }
  15. }

優(yōu)化后的實(shí)現(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.     f, err := doOtherThing(c)
  14.     if err != nil {
  15.         return err
  16.     }
  17. }

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


文章標(biāo)題:Go語言的有效錯(cuò)誤處理
網(wǎng)頁URL:http://www.dlmjj.cn/article/copcscd.html