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

對 Go2 錯誤處理提案的批判

開發 前端
通過對 Go2 錯誤處理的設計草案的復習,我們了解到了 check 和 handle 函數的用法和思路。再針對新的語法,又對可能發生的新問題進行了 “批判”。總的來說,新的語法,在弊端上會增加既有的代碼復雜度和可讀性,可以引發各種奇怪的嵌套,還會與 if err != nil 產生重復,變成了一種新的處理方式(多了一種)。是否會還不如 if err != nil 那么的純粹?

復習語法

在 2018 年 8 月,官方正式公布了 Go 2 Draft Designs[2],其中包含泛型和錯誤處理機制改進的初步草案:

圖片

Go 2 Draft Designs

下面是關鍵的 Go2 錯誤處理新語法。

錯誤處理(Error Handling)

第一個要解決的問題就是大量 if err != nil 的問題,針對此提出了 Go2 error handling[3] 的草案設計。

簡單例子:

if err != nil {
return err
}

優化后的方案如下:

func CopyFile(src, dst string) error {
handle err {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}

r := check os.Open(src)
defer r.Close()

w := check os.Create(dst)
handle err {
w.Close()
os.Remove(dst) // (only if a check fails)
}

check io.Copy(w, r)
check w.Close()
return nil
}

主函數:

func main() {
handle err {
log.Fatal(err)
}

hex := check ioutil.ReadAll(os.Stdin)
data := check parseHexdump(string(hex))
os.Stdout.Write(data)
}

該提案引入了兩種新的語法形式,首先是 check? 關鍵字,其可以選中一個表達式 check f(x, y, z)? 或 check err,其將會標識這是一個顯式的錯誤檢查。

其次引入了 handle? 關鍵字,用于定義錯誤處理程序流轉,逐級上拋,依此類推,直到處理程序執行 return 語句,才正式結束。

錯誤值打印(Error Printing)

第二個要解決的問題是錯誤值(Error Values)、錯誤檢查(Error Inspection)的問題,其引申出錯誤值打印(Error Printing)的問題,也可以認為是錯誤格式化的不便利。

官方針對此提出了提出了 Error Values[4] 和 Error Printing[5] 的草案設計。

簡單例子如下:

if err != nil {
return fmt.Errorf("write users database: %v", err)
}

優化后的方案如下:

package errors

type Wrapper interface {
Unwrap() error
}

func Is(err, target error) bool
func As(type E)(err error) (e E, ok bool)

該提案增加了錯誤鏈的 Wrapping Error 概念,并同時增加 errors.Is? 和 errors.As 的方法,與前面說到的 Go1.13 的改進一致,不再贅述。

Go1.13 沒有實現 %+v 輸出調用堆棧的需求(沒有調用棧,排查問題會很苦惱),因為此舉會破壞 Go1 兼容性和產生一些性能問題,大概會在 Go2 加入。

對提案批判

目標較為模糊

在 Go2 新錯誤處理的提案和草案中,@Liam Breck 認為其沒有去討論根本的需求。僅有一個簡短的目標部分,如下四點:

  • 占用空間小的錯誤檢查。
  • 對開發人員友好的錯誤處理。
  • 顯式檢查和處理錯誤。
  • 保證現有 Go1 代碼的兼容性。

更也沒有提到未來可能的擴展性,只是純粹的滿足當下的訴求。這類是模糊的,在激發新的設計思路上有局限性。

無法統一錯誤處理

在真實的應用中,一個函數使用兩種及以上的重復錯誤處理方式是非常常見的。

如下代碼:

// 方式 1
{ debug.PrintStack(); log.Fatal(err) }

// 方式 2
{ log.Println(err) }

// 方式 3
{ if err == io.EOF { break } }

// 方式 4
{ conn.Write([]byte("oops: " + err.Error())) } // network server

新提案中,check 和 handle 函數并不提供多種處理錯誤的途徑。這是一個明顯的遺漏,也沒法統一錯誤處理機制。

如此的話,check 和 handle 就完全是只加了一種新的方式,讓原本的錯誤處理機制更加的繁雜。

混用 err != nil 和 check

handle 函數是后進先出的模式,只能從一個函數中跳出。也就是說它不能很友好的處理可恢復的錯誤內容。

但實際上,許多方法返回錯誤是很常見的。因此我們需要同時使用 err!= nil 和 check,顯得非常的繁瑣。

如下代碼:

handle err { ... }
v, err := f()
if err != nil {
if isBad(err) {
check err
}
// recovery code
}

又是 if err != nil,又是 handle,又是 check 函數。

嵌套 check 更復雜

通過 check 函數,對返回錯誤的函數調用進行嵌套調用,將會模糊了操作的順序。

雖然在大多數情況下,錯誤發生時的調用順序應該是清楚的,但在 check 函數下會顯得不如 if err != nil 清晰。

如下代碼:

check step4(check step1(), check step3(check step2())

另外嵌套代碼會助長不可讀的結構:

f1(v1, check f2(check f3(check f4(v4), v3), check f5(v5))

現在回顧一下,該語言禁止。

f(t ? a : b) 和 f(a++)

是不是顯得有些諷刺呢?

if err != nil 太好用

Go1 的錯誤處理程序太友好了,也就是:

if err != nil {
...
}

其挫敗了 "提高開發人員編寫錯誤處理程序的可能性" 的目標,它使得在沒有上下文信息的情況下返回錯誤是很容易的。會降低對 handle、check 函數的使用頻率,變成一個可有可無的東西。

注:個人感覺,這一點既像黑又像粉...原作者反串黑?當然,確實 if err != nil 很好上手。

復雜的錯誤鏈

對于下面的例子,看看它的感覺...

如下代碼:

func f() error {
handle err { return ... } // finally this
if ... {
handle err { ... } // not that
for ... {
handle err { ... } // nor that
...
}
}
handle err { ... } // secondly this
...
if ... {
handle err { ... } // not that
...
} else {
handle err { ... } // firstly this
check thisFails() // trigger
}
}

顯然,這段代碼是 “難以捉摸” 的,我們必須用眼睛解析整個函數,理解整個錯誤處理的流程和順序。

將會加大我們對程序的認知負擔。

總結

通過對 Go2 錯誤處理的設計草案的復習,我們了解到了 check 和 handle 函數的用法和思路。再針對新的語法,又對可能發生的新問題進行了 “批判”。

總的來說,新的語法,在弊端上會增加既有的代碼復雜度和可讀性,可以引發各種奇怪的嵌套,還會與 if err != nil 產生重復,變成了一種新的處理方式(多了一種)。

是否會還不如 if err != nil 那么的純粹?

參考資料

[1]Golang, how dare you handle my checks!: 

[2]Go 2 Draft Designs: https://go.googlesource.com/proposal/+/master/design/go2draft.md

[3]Go2 error handling: https://github.com/golang/proposal/blob/master/design/go2draft-error-handling-overview.md

[4]Error Values: https://github.com/golang/proposal/blob/master/design/go2draft-error-values-overview.md

[5]Error Printing: https://github.com/golang/proposal/blob/master/design/go2draft-error-printing.md

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2022-07-13 08:53:28

函數Go語言

2021-09-13 07:53:31

Go錯誤處理

2024-06-05 08:47:20

Go語言方式

2022-10-24 08:55:13

Go工具鏈開發者

2014-11-17 10:05:12

Go語言

2021-04-29 09:02:44

語言Go 處理

2024-11-19 09:10:19

迭代器Go語言

2025-02-08 09:57:20

2025-03-31 00:29:44

2025-06-06 06:45:54

2025-09-05 01:55:00

Go并發錯誤項目

2025-06-30 09:49:11

2017-09-22 15:25:40

Go語言其他語言錯誤處理

2016-08-19 10:41:42

Swift 2錯誤

2020-12-17 06:25:05

Gopanic 模式

2023-10-26 15:49:53

Go日志

2021-09-27 15:33:48

Go 開發技術

2021-09-27 23:28:29

Go多協程并發

2021-09-27 10:04:03

Go程序處理

2021-04-14 07:08:14

Nodejs錯誤處理
點贊
收藏

51CTO技術棧公眾號

亚洲欧美久久久| 久久97超碰色| 国产精品视频一区二区三区四蜜臂| 亚洲成人影音| 不卡一二三区首页| 日韩av在线发布| 日本欧美在线观看| 亚洲欧美在线免费观看| 国产欧美精品一区二区| 爱情岛论坛亚洲首页入口章节| 少妇精品久久久一区二区三区| 成人一道本在线| 国产女人18水真多18精品一级做| 国产精品久久久一区麻豆最新章节| 国产精品yjizz视频网| 亚洲欧洲美洲一区二区三区| 中文字幕福利片| a级日韩大片| 久久午夜电影| 亚洲欧美另类久久久精品2019| 日韩电视剧免费观看网站| 日韩国产欧美一区| 国产精品chinese在线观看| 日本不卡一二三区黄网| 日本久久久久久久久| 午夜精品视频在线观看一区二区 | 中午字幕在线观看| 91精品福利视频| 国产精品香蕉在线观看| 日本在线观看| 欧美色道久久88综合亚洲精品| 欧美日韩在线亚洲一区蜜芽| 992tv成人免费观看| 日韩极品在线| 亚洲色图欧美制服丝袜另类第一页| 午夜成在线www| 久久综合给合久久狠狠狠97色69| 香蕉成人伊视频在线观看| 日本不卡高清视频一区| 久久中文字幕av| 日本成人免费在线| 国产精品成人**免费视频| 亚洲精品国产电影| 中文字幕在线观看一区二区三区| 日韩精品中文字幕第1页| 亚洲成人短视频| 国产清纯在线一区二区www| 日本一区二区三区在线视频| 红桃视频国产一区| 99国产视频| 三级4级全黄60分钟| 国产精品自拍三区| 成人18视频| 国产精品99久久99久久久二8| 香蕉视频亚洲一级| 一道本无吗dⅴd在线播放一区| 国产精品免费观看久久| 久草在线综合| 91国产高清在线| 91av视频在线观看| 国产激情美女久久久久久吹潮| 国产精品久久国产精品| 夜夜爽夜夜爽精品视频| 青娱在线视频| 日韩欧美精品| 福利一区在线观看| 第一福利在线| 精品一区免费| 日韩免费在线看| 日本不卡电影| 97超碰最新| 免费在线观看成人| 国产 日韩 亚洲 欧美| 欧美色婷婷久久99精品红桃| 国产欧美日韩精品丝袜高跟鞋| av丝袜在线| 一区二区三区精品视频| 日韩大胆视频| 精品国产一二三| 依依成人在线| caoporn国产一区二区| 88av.com| 精品久久久久久久久久久久久久| 黄色av网站在线播放| 中文字幕色av一区二区三区| 久久久神马电影| 韩国女主播成人在线| 国产精品久久久av| 欧美激情综合色综合啪啪| 欧美人在线观看| 欧美精品日韩一本| 91麻豆精品秘密入口| www.中文字幕久久久| 精品第一国产综合精品aⅴ| 成人做爰视频www| 欧美一区二区黄| 亚洲视频资源| 999视频在线观看| 成人av网在线| 日韩在线无毛| 一区二区在线视频| 亚洲精品久久| 国产91网红主播在线观看| 综合天天久久| 好吊妞无缓冲视频观看| 欧美日韩中文字幕| 久久青草视频| 亚洲男人的天堂网站| 国产一区二区三区站长工具| 在线日韩av永久免费观看| 亚洲成av人影院在线观看网| 日本成人片在线| 99影视tv| 国产欧美日本一区二区三区| 男女免费观看在线爽爽爽视频| 欧美野外猛男的大粗鳮| 高清成人在线观看| 国产美女av在线| 国产精品视频自在线| 91在线精品一区二区| 免费污视频在线观看| 成人亚洲欧美一区二区三区| 久久久国际精品| 精品极品在线| 精品捆绑美女sm三区| 黄色免费网站在线| 国产精品久久网| 91亚洲男人天堂| 丝袜亚洲另类欧美综合| 国产视频二区| 久久艳片www.17c.com| 视频一区二区中文字幕| 你懂的在线网址| 国产999精品久久久| 久久免费视频色| 欧美成人精品一区二区男人小说| 久久国产精品精品国产色婷婷| 亚洲成年人影院| 日韩精品欧美大片| 国产福利视频在线播放| 亚洲人成啪啪网站| 麻豆国产精品一区二区三区| caopon在线免费视频| 91精品国产综合久久久久久| 久久综合色占| 爱草在线视频| 91精品国产高清自在线看超| 久久久天堂av| 久久久久久亚洲精品美女| 无码人妻精品一区二区蜜桃网站| 久久网站热最新地址| 电影网一区二区| 中文字幕在线日韩| 久久99日本精品| 高清在线视频不卡| 亚洲mv在线看| 亚洲福利在线视频| 麻豆精品在线视频| 午夜影院在线观看国产主播| 欧美高清一级大片| 日韩电影一区| 男女激情网站| 国产精品久久久久久久久久小说| 国产精品成人一区二区三区夜夜夜 | 国产精品久久久网站| 粉嫩虎白女毛片人体| 色老头一区二区三区| 91麻豆国产福利在线观看| 午夜精品免费在线| 二人午夜免费观看在线视频| 国产成人av一区二区三区| 婷婷六月综合网| 欧美日本一区| 国产日产一区二区三区| 天天好比中文综合网| 亚洲午夜av电影| www国产成人免费观看视频 深夜成人网| www 久久久| а√最新版在线天堂| 成人在线免费观看视视频| 亚洲永久网站| 国产一线二线在线观看| 在线观看三级网站| 男女羞羞网站| 日韩小视频在线观看| 久久久久亚洲| 久草在现在线| 久久成人精品一区二区三区| 中国字幕a在线看韩国电影| 18+激情视频在线| 成人免费在线视频网址| 日韩福利在线播放| 一区二区三区 在线观看视频| 国产一区二区影视| 麻豆av福利av久久av| 国产精品99久久久久久宅男| 亚洲成人精品综合在线| 日本一二三区视频免费高清| 日韩在线视频观看| 亚洲欧美一区二区在线观看|