91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中怎么有效處理錯誤

發布時間:2021-07-20 15:20:41 來源:億速云 閱讀:169 作者:Leah 欄目:web開發

今天就跟大家聊聊有關Go語言中怎么有效處理錯誤,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

一、簡介

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

二、在縮進區處理錯誤

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

f, err := os.Open(path) if err != nil {     // handle error } // do stuff  而不是下面這樣的:  f, err := os.Open(path) if err == nil {     // do stuff } // handle error

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

三、定義你自己的errors

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

type Error string func (e Error) Error() string { return string(e) }

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

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

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

type ParseError struct {     File  *File     Error string }  func (oe *ParseError) Error() string {//譯注:原文中這里是OpenError     // format error string here }  func ParseFiles(files []*File) error {     for _, f := range files {         err := f.parse()         if err != nil {             return &ParseError{ //譯注:原文中這里是OpenError                 File:  f,                 Error: err.Error(),             }         }     } }

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

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

var c net.Conn f, err := DownloadFile(c, path) switch e := err.(type) { default:     // this will get executed if err == nil case net.Error:     // close connection, not valid anymore     c.Close()     return e case error:     // if err is non-nil     return err } // do other things.

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

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

四、將錯誤作為狀態

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

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

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

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

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

func handleError(c net.Conn, err error) {     // repeated error handling }  func DoStuff(c net.Conn) error {     f, err := downloadFile(c, path)     if err != nil {         handleError(c, err)         return err     }      f, err := doOtherThing(c)     if err != nil {         handleError(c, err)         return err     } }

優化后的實現方法如下:

func handleError(c net.Conn, err error) {     if err == nil {         return     }     // repeated error handling }  func DoStuff(c net.Conn) error {     defer func() { handleError(c, err) }()     f, err := downloadFile(c, path)     if err != nil {         return err     }      f, err := doOtherThing(c)     if err != nil {         return err     } }

看完上述內容,你們對Go語言中怎么有效處理錯誤有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高邮市| 景谷| 汝城县| 黎川县| 成都市| 张家口市| 浪卡子县| 巨鹿县| 南开区| 平山县| 高雄市| 洛南县| 淮滨县| 闽侯县| 旅游| 昌宁县| 驻马店市| 太原市| 资源县| 浦东新区| 柯坪县| 柳江县| 临城县| 陇西县| 南宫市| 云和县| 万载县| 九寨沟县| 无棣县| 壶关县| 本溪市| 巩义市| 石首市| 新蔡县| 泉州市| 依兰县| 班玛县| 丽江市| 高淳县| 大荔县| 高密市|