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

溫馨提示×

溫馨提示×

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

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

利用golang實現封裝trycatch異常處理實例代碼

發布時間:2020-09-01 15:30:51 來源:腳本之家 閱讀:206 作者:xiaorui 欄目:編程語言

前言

社區不少人在談論 golang 為毛不用trycatch模式,而采用苛刻的recovery、panic、defer組合….    從網上整了一個trycatch包,感覺不錯,拿出來分享下…下面話不多說,來一起看看詳細的介紹。

示例代碼

package main
 
import (
 "reflect"
)
 
type TryCatch struct {
 errChan  chan interface{}
 catches  map[reflect.Type]func(err error)
 defaultCatch func(err error)
}
 
func (t TryCatch) Try(block func()) TryCatch {
 t.errChan = make(chan interface{})
 t.catches = map[reflect.Type]func(err error){}
 t.defaultCatch = func(err error) {}
 go func() {
 defer func() {
 t.errChan <- recover()
 }()
 block()
 }()
 return t
}
 
func (t TryCatch) CatchAll(block func(err error)) TryCatch {
 t.defaultCatch = block
 return t
}
 
func (t TryCatch) Catch(e error, block func(err error)) TryCatch {
 errorType := reflect.TypeOf(e)
 t.catches[errorType] = block
 return t
}
 
func (t TryCatch) Finally(block func()) TryCatch {
 err := <-t.errChan
 if err != nil {
 catch := t.catches[reflect.TypeOf(err)]
 if catch != nil {
 catch(err.(error))
 } else {
 t.defaultCatch(err.(error))
 }
 }
 block()
 return t
}
 
type MyError struct {
 error
}
 
func main() {
 TryCatch{}.Try(func() {
 println("do something buggy")
 panic(MyError{})
 }).Catch(MyError{}, func(err error) {
 println("catch MyError")
 }).CatchAll(func(err error) {
 println("catch error")
 }).Finally(func() {
 println("finally do something")
 })
 println("done")
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

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

AI

莒南县| 汝州市| 九龙城区| 万源市| 托里县| 友谊县| 巴林右旗| 扎赉特旗| 枣庄市| 河池市| 化德县| 广西| 平顶山市| 宜宾县| 满城县| 长白| 新民市| 贡山| 保德县| 安福县| 子长县| 乐东| 瓦房店市| 齐河县| 大埔县| 筠连县| 普格县| 洱源县| 马龙县| 大埔区| 普安县| 雷山县| 清远市| 宁武县| 邵阳市| 乌什县| 瓦房店市| 高雄县| 华蓥市| 中江县| 龙口市|