精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你對 Go 錯誤處理的 4 個誤解!

開發 前端
Go 語言中錯誤處理的機制一直是各大 Gopher 熱議的問題。甚至一直有人寄望 Go 支持 throw 和 catch 關鍵字,實現與其他語言類似的特性。社區里的討論也從未停過。

[[423405]]

大家好,我是煎魚。

Go 語言中錯誤處理的機制一直是各大 Gopher 熱議的問題。甚至一直有人寄望 Go 支持 throw 和 catch 關鍵字,實現與其他語言類似的特性。社區里的討論也從未停過。

今天煎魚帶大家了解幾個 Go 語言的錯誤處理中,大家最關心,也是最容易被誤解、被嫌棄的問題:

  • 為什么不支持 try-catch?
  • 為什么不支持全局捕獲的機制?
  • 為什么要這么設計錯誤處理?
  • 未來的錯誤處理機制會怎么樣?

落寞的 try-catch

在 Go1 時,大家知道基本不可能支持。于是打起了 Go2 的主意。為什么 Go 就不能支持 try-catch 組合拳?

上一年宣發了 Go2 的構想,所以在 2020 年就有小伙伴乘機提出過類似 《proposal: Go 2: use keywords throw, catch, and guard to handle errors[1]》的提案,這可是其他語言都支持的,Go 語言怎么了?

下面來自該提案的演示,Go1 的錯誤處理:

  1. type data struct {} 
  2.  
  3. func (d data) bar() (string, error) { 
  4.     return "", errors.New("err"
  5.  
  6. func foo() (data, error) { 
  7.     return data{}, errors.New("err"
  8.  
  9. func do () (string, error) { 
  10.     d, err := foo() 
  11.     if err != nil { 
  12.         return "", err 
  13.     } 
  14.  
  15.     s, err := d.bar() 
  16.     if err != nil { 
  17.         return "", err 
  18.     } 
  19.  
  20.     return s, nil 

新提案所改造的方式:

  1. type data struct {} 
  2.  
  3. func (d data) bar() string { 
  4.     throw "", errors.New("err"
  5.  
  6. func foo() (d data) { 
  7.     throw errors.New("err"
  8.     return 
  9.  
  10. func do () (string, error) { 
  11.     catch err { 
  12.         return "", err  
  13.     } 
  14.  
  15.     s := foo().bar() 
  16.     return s, nil 

不過答復非常明確,@davecheney 在底下回復“以最強烈的措辭,不(In the strongest possible terms, no)”。這可讓人懵了圈,為什么這么硬呢?

其實 Go 官方早在《Error Handling — Problem Overview[2]》提案早已明確提過,Go 官方在設計上會有意識地選擇使用顯式錯誤結果和顯式錯誤檢查。

結合《language: Go 2: error handling meta issue[3]》可得知,要拒絕 try-catch 關鍵字的主要原因是:

  • 會涉及到額外的流程控制,因為使用 try 的復雜表達式,會導致函數意外返回。
  • 在表達式層面上沒有流程控制結構,只有 panic 關鍵字,它不只是從一個函數返回。

說白了,就是設計理念不合,加之實現上也不大合理。在以往的多輪討論中早已被 Go 團隊拒絕了。

反之 Go 團隊倒是一遍遍在回答這個問題,已經不大耐煩了,直接都整理了 issues 版的 FAQ 了。

想捕獲所有 panic

在 Go 語言中,有一個點,很多新同學會不一樣碰到的。那就是在 goroutine 中如果 panic 了,沒有加 recover 關鍵字(有時候也會忘記),就會導致程序崩潰。

又或是以為加了 recover 就能保障一個 goroutine 下所派生出來的 goroutine 所產生的 panic,一勞永逸。

但現實總是會讓人迷惑,我經常會看到有同學提出類似的疑惑:

來自 Go 讀者交流群

這時候,有其他語言經驗的同學中,又有想到了一個利器。能不能設置一個全局的錯誤處理 handler。

像是 PHP 語言也可以有類似的方法:

  1. set_error_handler(); 
  2. set_exception_handler(); 
  3. register_shutdown_function(); 

顯然,Go 語言中并沒有類似的東西。歸類一下,我們聚焦以下兩個問題:

  • 為什么 recover 不能捕獲更上層的 panic?
  • 為什么 Go 沒有全局的錯誤處理方法?

源碼層面

如果是講設計的話,其實只是通過 Go 的 GMP 模型和 defer+panic+recver 的源碼剖析就能知道了。

本質上 defer+panic 都是掛載在 G 上的,可查看我以前寫的《深入理解 Go panic and recover[4]》,你會有更多深入的理解。

設計思想

在本文中我們不能僅限于源碼,需要更深挖,Go 設計者他的思想是什么,為什么就是不支持?

在 Go issues 中《proposal: spec: allow fatal panic handler[5]》、《No way to catch errors from goroutines automatically[6] 》分別的針對性探討過上述問題。

Go 團隊的大當家 @Russ Cox 給出了明確的答復:Go 語言的設計立場是錯誤恢復應該在本地完成,或者完全在一個單獨的進程中完成。

這就是為什么 Go 語言不能跨 goroutines 從 panic 中恢復,也不能從 throw 中恢復的根本原因,是語言設計層面的思想所決定。

在源碼剖析時,你所看到的整套 GMP+defer+panic+recover 的機制機制,就是跟隨著這個設計思想去編寫和發展的。

設計思想決定源碼實現。

建議方式

從 Go 語言層面去動搖這個設計思想,目前來看可能性很低。至少 2021 年的現在沒有看到改觀。

整體上會建議提供公共的 Go 方法去規避這種情況。參考 issues 所提供的范例如下:

  1. recovery.SafeGo(logger, func() { 
  2.     method(all parameters) 
  3. }) 
  4.  
  5. func SafeGo(logger logging.ILogger, f func()) { 
  6.  go func() { 
  7.   defer func() { 
  8.    if panicMessage := recover(); panicMessage != nil { 
  9.     ... 
  10.    } 
  11.   }() 
  12.  
  13.   f() 
  14.  }() 

是不是感覺似曾相識?

每家公司的內部庫都應該有這么一個工具方法,規避偶爾忘記的 goroutine recover 所引發的奇奇怪怪問題。

也可以參照建議,利用一個單獨的進程(Go 語言中是 goroutine)去統一處理這些 panic,不過這比較麻煩,較少見。

未來會如何

Go 社區對 Go 語言未來的錯誤處理機制非常關心,因為 Go1 已經米已成炊,希望在 Go2 上解決錯誤處理機制的問題。

期望 Go2 核心要處理的包含如下幾點(#40432):

對于 Go2,我們希望使錯誤檢查更加輕便,減少專門用于錯誤檢查的 Go 程序代碼的數量。我們還想讓寫錯誤處理更方便,減少程序員花時間寫錯誤處理的可能性。

錯誤檢查和錯誤處理都必須保持明確,即在程序文本中可見。我們不希望重復異常處理的陷阱。

現有的代碼必須繼續工作,并保持與現在一樣的有效性。任何改變都必須與現有的代碼相互配合。

為此,許多人提過不少新的提案...很可惜,截止 2021.08 月底為止,有許多人試圖改變語言層面以達到這些目標,但沒有一個新的提案被接受。

現在也有許多變更并入 Go2 提案,主要是 error-handling 方面的優化。

大家有興趣可以看看我之前寫的:《先睹為快,Go2 Error 的掙扎之路》,相信能給你帶來不少新知識。

總結

看到這里,我們不由得想到。為什么,為什么在 21 世紀前者已經有了這么多優秀的語言,Go 語言的錯誤處理機制依然這么的難抉擇?

顯然 Go 語言的開發團隊是有自己的設計哲學和思想的,否則 “less is more” 也不會如此廣泛流傳。設身處地的理解 Go 官方的想法,而不是一味地單向理解,會對我們未來的編程之路更好。

當然,這存在著一系列既要也要的問題,不好處理。歡迎大家關注煎魚,后續我們也可以面向 Go 后續的錯誤處理持續的關注和討論!

參考資料

[1]proposal: Go 2: use keywords throw, catch, and guard to handle errors: https://github.com/golang/go/issues/40583

[2]Error Handling — Problem Overview: https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling-overview.md

[3]language: Go 2: error handling meta issue: https://github.com/golang/go/issues/40432

[4]深入理解 Go panic and recover: https://eddycjy.com/posts/go/panic/2019-05-21-panic-and-recover/

[5]proposal: spec: allow fatal panic handler: https://github.com/golang/go/issues/32333

[6]No way to catch errors from goroutines automatically: https://github.com/golang/go/issues/20161

 

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

2022-09-05 08:55:15

Go2提案語法

2014-11-17 10:05:12

Go語言

2021-04-29 09:02:44

語言Go 處理

2025-06-06 06:45:54

2025-03-31 00:29:44

2025-06-30 09:49:11

2025-09-05 01:55:00

Go并發錯誤項目

2013-08-12 10:02:38

微軟Windows 8云計算

2017-09-22 15:25:40

Go語言其他語言錯誤處理

2024-10-06 13:49:30

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程序處理

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錯誤

2024-09-23 16:49:32

點贊
收藏

51CTO技術棧公眾號

欧美麻豆精品久久久久久| 99久久免费国产| 美女av一区二区三区| 黑人玩弄人妻一区二区三区| 国产精品av一区二区三区| 国产精品午夜久久| av成人观看| 黄色大全在线观看| 黄色工厂这里只有精品| 亚洲人成在线免费观看| 久久无码人妻一区二区三区| 韩漫成人漫画| 夜夜揉揉日日人人青青一国产精品| 精选一区二区三区四区五区| 一区二区久久精品66国产精品| 亚洲大片av| 国产一区二区三区在线视频| 亚洲天堂av网站| 亚洲男男av| 色综合亚洲欧洲| www成人免费| 九色porny丨首页在线| 91视频在线看| 粉嫩av四季av绯色av第一区| 中文字幕在线观看国产| 国产精品乱看| 久久人人爽人人| 欧美亚洲日本在线| 欧美hentaied在线观看| 亚洲欧美日韩在线一区| yjizz视频| 日韩欧美激情电影| 精品视频一区三区九区| 老头吃奶性行交视频| 牛牛精品在线视频| 亚洲色图视频免费播放| 亚洲精品一区国产精品| 国家队第一季免费高清在线观看| 不卡一区二区在线| 97伦理在线四区| 99久久久无码国产精品免费| 美日韩一区二区三区| 日本高清+成人网在线观看| 日韩av一区二区在线播放| 欧美成人69av| 米奇精品一区二区三区在线观看| 小嫩苞一区二区三区| 日本一区二区高清不卡| 国产午夜精品全部视频播放| 久久久无码人妻精品一区| 欧美三级电影在线| 日韩精品视频观看| 黄色污在线观看| 色综合www| 亚洲裸体xxxx| 韩国三级hd中文字幕| 国产探花在线精品一区二区| 亚洲欧美日韩中文在线| 免费看日本黄色片| 日韩精品免费一区二区在线观看 | 91日韩视频在线观看| av有声小说一区二区三区| 91精品福利在线| 欧美日韩在线观看不卡| 日本欧美在线| 日韩一区二区中文字幕| 在线观看亚洲免费视频| 欧美大片网址| 尤物九九久久国产精品的特点| 91激情视频在线观看| 久久大综合网| 九九热精品在线| 99精品视频99| 日本欧美一区二区在线观看| 91精品在线看| 黄色www视频| 久久久精品tv| 三年中文高清在线观看第6集| 18加网站在线| 欧美午夜视频一区二区| 蜜臀av免费观看| 日韩一区二区三区精品| 亚洲女人被黑人巨大进入al| 欧美一区二区三区观看| 欧美午夜不卡影院在线观看完整版免费| 97碰在线观看| 免费看av在线| 国产成人综合网| 欧美日韩大片一区二区三区| 免费在线观看黄| 亚洲一区二区三区四区五区中文| 欧美 日韩 国产一区| 国产麻豆精品| 亚洲欧美日韩国产成人| 亚洲天堂网av在线| 一区二区毛片| 91欧美精品午夜性色福利在线| 深爱五月激情五月| 中文字幕中文字幕一区| 男人和女人啪啪网站| 97色婷婷成人综合在线观看| 亚洲精品成a人在线观看| 国精品人伦一区二区三区蜜桃| 亚洲福利一区| 92国产精品视频| 日本一区二区三区在线观看视频| 亚洲视频在线一区二区| 日本成年人网址| 日韩一二三区| 色婷婷久久av| 亚洲欧美日韩激情| 成人午夜视频在线| 艳色歌舞团一区二区三区| 三妻四妾完整版在线观看电视剧 | 亚洲综合在线第一页| 青青在线视频免费| 国产一区二区在线视频你懂的| 日韩中文理论片| 日韩精品久久久久久免费| 国产精品18久久久久久久网站| 四虎一区二区| 欧美成人h版| 日韩成人xxxx| 日韩三级视频在线| 高清shemale亚洲人妖| 综合视频在线观看| 电影一区电影二区| 亚洲天堂av在线免费观看| 日韩美女视频网站| 成人性生交大片免费看中文 | 欧美一区二区视频免费观看| 性猛交娇小69hd| 亚久久调教视频| 国产亚洲一区在线播放| 免费在线看电影| 日韩欧美国产三级| 福利所第一导航| 国产呦萝稀缺另类资源| 中文字幕中文字幕99| 激情久久一区二区| 日韩在线欧美在线国产在线| 波多野结衣在线观看一区| 久久香蕉国产线看观看99| 黄色一级在线视频| 国产主播性色av福利精品一区| 色综合久久天天综线观看| 国产日韩欧美一区二区东京热 | 3d欧美精品动漫xxxx无尽| 日韩精品黄色网| av大片在线免费观看| 99国产欧美另类久久久精品 | 蜜桃av一区二区| 亚洲制服欧美久久| www.精品国产| 久久中文字幕在线视频| 精品免费久久久| 亚洲午夜视频在线观看| 欧美熟妇精品一区二区蜜桃视频 | 超碰影院在线观看| 欧美一区二区三区高清视频| 国产精品老女人视频| 95在线视频| 6080国产精品一区二区| 青青青在线免费观看| 国产不卡视频一区| 午夜免费福利小电影| 亚洲婷婷伊人| 国产精品你懂得| 黄色网页在线免费观看| 欧美一区二区三区免费大片| www.99re7.com| 91在线porny国产在线看| 成年人免费在线播放| 日本精品黄色| 18成人在线| 妞干网免费在线视频| 国产一区二区美女视频| 91av国产精品| 亚洲成人第一页| 人与嘼交av免费| 国产1区2区3区精品美女| 1024精品视频| 91精品久久久久久久久久不卡| 成人午夜电影在线播放| 亚洲播播91| 欧美成人性生活| 免费在线一级视频| 欧美一区二区播放| 中文字幕高清在线免费播放| 成人欧美一区二区三区在线播放| av av在线| 日本不卡视频一二三区| 国内精品国产三级国产99| 亚洲欧洲美洲国产香蕉| 91日韩在线视频| 免费亚洲电影| 欧美激情极品视频| 福利在线午夜| 亚洲第一视频网站| 97人妻精品一区二区三区| 偷拍与自拍一区| 538精品在线视频| 国产欧美久久久精品影院| 老熟女高潮一区二区三区| 日本免费在线视频不卡一不卡二| 国产高清www| 五月婷婷六月综合| 日韩不卡av| 欧美电影在线观看免费| 91香蕉电影院| 粉嫩av一区二区三区四区五区| 97久久精品国产| 欧美人动性xxxxz0oz| 日韩中文字幕视频在线观看| 欧美一区二区视频| 亚洲国产精品久久91精品| 国产男女裸体做爰爽爽| 日本高清无吗v一区| 日本少妇裸体做爰| 伊人色综合久久天天人手人婷| 国产成人免费观看网站| 97精品国产露脸对白| 91成人在线观看喷潮蘑菇| 久久精品国产一区二区三区免费看| 男人添女人下面高潮视频| 国产一区欧美| 亚洲一区 在线播放| 欧美gay男男猛男无套| 色视频一区二区三区| 亚洲日产av中文字幕| 久久亚洲国产精品日日av夜夜| 4438全国亚洲精品观看视频| 91久久精品一区| 亚洲精品自拍| 国产综合久久久久| 亚洲天堂1区| 国产精品流白浆视频| 免费观看成人性生生活片| 欧美在线视频a| 性感女国产在线| 欧美亚洲国产视频| 校园春色亚洲| 日本成人免费在线| 在线成人视屏| 国产精品视频一区二区高潮| 成人在线免费| 国产日本欧美一区| 四虎影视成人精品国库在线观看 | 欧美国产乱视频| 国产后进白嫩翘臀在线观看视频| 欧美福利视频网站| xxx.xxx欧美| 91成人精品网站| 欧美一区国产| 国产成人综合亚洲| 先锋影音网一区二区| 91夜夜揉人人捏人人添红杏| 成人激情久久| 99久久伊人精品影院| 国产精品自在线拍| 欧美高清视频一区二区三区在线观看| 伊人久久大香线蕉综合网蜜芽| 免费中文日韩| 成人3d精品动漫精品一二三| 色呦呦网站入口| 欧美体内she精视频在线观看| 久久久久久久久久网| 亚洲欧美日本视频在线观看| 五月婷婷激情久久| 激情另类小说区图片区视频区| 丰满人妻一区二区三区53视频| 国产69精品久久777的优势| 狠狠人妻久久久久久综合蜜桃| 久久久亚洲午夜电影| a级黄色免费视频| 一区二区三区免费在线观看| 日本少妇激情舌吻| 欧美日韩在线播放三区四区| 精品久久久久成人码免费动漫| 亚洲精品乱码久久久久久金桔影视 | 成人免费高清视频在线观看| 深爱五月激情网| 综合在线观看色| av中文在线播放| 欧美日韩国产系列| 黄色av小说在线观看| 中国人与牲禽动交精品| 色网在线观看| 国产精品第七影院| 亚洲日本视频在线| 日本免费高清不卡| 韩国欧美一区| 欧美成人三级在线播放| 丰满亚洲少妇av| 精品日韩在线视频| 亚洲v中文字幕| 一级黄色片免费看| 亚洲美女自拍视频| 男人天堂亚洲| 91久久久久久久久久| 在线日本制服中文欧美| 久久人妻无码一区二区| 日韩精品一二三| 久久久老熟女一区二区三区91| 国产精品无人区| 久久中文字幕免费| 精品少妇一区二区三区在线播放| 风间由美一区| 91成人在线视频| 成人线上播放| 久久久久久久免费视频| 麻豆精品在线播放| 国产精品无码午夜福利| 亚洲午夜激情网站| 国产色综合视频| 尤物yw午夜国产精品视频| 咪咪网在线视频| av在线不卡一区| 一本精品一区二区三区| 日韩一级理论片| 久久综合久久综合亚洲| 国产亚洲欧美久久久久| 91精品麻豆日日躁夜夜躁| 91在线看片| 国产福利视频一区| 加勒比久久综合| 国产91在线免费| 99久久精品情趣| 国产精品成人av久久| 日韩美女视频一区二区在线观看| 黄视频在线观看网站| 国产精品一区二区性色av| 精品国产aⅴ| 欧美精品成人网| 久久久久9999亚洲精品| youjizz在线视频| 精品视频—区二区三区免费| 成年女人在线看片| 国产亚洲精品自在久久| 一本色道久久综合亚洲精品不卡| 亚洲婷婷在线观看| 五月天网站亚洲| 四虎影视精品成人| 国产成人精品视频在线观看| 欧洲杯足球赛直播| 青青草原国产在线视频| 中文字幕日本不卡| 国产wwwxxx| 久久久久久亚洲精品中文字幕| 午夜视频一区二区在线观看| 久操手机在线视频| 不卡的av网站| 国产嫩bbwbbw高潮| 中文字幕日韩在线播放| 亚洲精品tv| 日本aa在线观看| 99精品国产99久久久久久白柏| 日韩一级片中文字幕| 中文字幕亚洲专区| 国产欧美88| 国产真人做爰毛片视频直播| 337p粉嫩大胆色噜噜噜噜亚洲| 91青青草视频| 久久久999成人| 岛国成人av| www日韩在线观看| 成人免费一区二区三区视频| 亚洲精品一级片| 清纯唯美亚洲综合| 午夜av一区| 97人妻天天摸天天爽天天| 欧美专区日韩专区| av在线下载| 免费成人看片网址| 极品少妇xxxx精品少妇| 久久久久久久久艹| 亚洲精选在线观看| 国产激情精品一区二区三区| 国产精品入口芒果| 欧美韩国日本一区| 国内爆初菊对白视频| 国产精品91久久| 欧美日韩国内| 天天摸日日摸狠狠添| 精品免费一区二区三区| 久久野战av| 欧美黑人在线观看| 欧美国产成人精品| 高清乱码毛片入口| 国产精品偷伦免费视频观看的| 欧美日韩精品| 99久久久无码国产精品不卡| 亚洲国产欧美在线成人app| 激情亚洲小说| 亚洲国产精品久久久久爰色欲| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲大胆人体在线| 亚洲精品69| 国产v亚洲v天堂无码久久久| 亚洲一区二区3|