利用golang實(shí)現(xiàn)封裝trycatch異常處理實(shí)例代碼
前言
社區(qū)不少人在談?wù)?golang 為毛不用trycatch模式,而采用苛刻的recovery、panic、defer組合…. 從網(wǎng)上整了一個(gè)trycatch包,感覺不錯(cuò),拿出來分享下…下面話不多說,來一起看看詳細(xì)的介紹。
示例代碼
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")
}
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
gin正確多次讀取http?request?body內(nèi)容實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了gin正確多次讀取http?request?body內(nèi)容實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
從基礎(chǔ)到高級(jí)全方位解析Go中反射的應(yīng)用
本文我們將全面深入地探討Go語言的反射機(jī)制,從反射的基礎(chǔ)概念、為什么需要反射,到如何在Go中實(shí)現(xiàn)反射,以及在高級(jí)編程場景如泛型編程和插件架構(gòu)中的應(yīng)用,需要的可以參考下2023-10-10
Go語言實(shí)現(xiàn)基于websocket瀏覽器通知功能
這篇文章主要介紹了Go語言實(shí)現(xiàn)基于websocket瀏覽器通知功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
golang使用sort接口實(shí)現(xiàn)排序示例
這篇文章主要介紹了golang使用sort接口實(shí)現(xiàn)排序的方法,簡單分析了sort接口的功能并實(shí)例演示了基于sort接口的排序?qū)崿F(xiàn)方法,需要的朋友可以參考下2016-07-07
Go語言使用MongoDB數(shù)據(jù)庫詳細(xì)步驟
mongodb是一種高性能、開源、文檔型的nosql數(shù)據(jù)庫,被廣泛應(yīng)用于web應(yīng)用、大數(shù)據(jù)以及云計(jì)算領(lǐng)域,下面這篇文章主要給大家介紹了關(guān)于Go語言使用MongoDB數(shù)據(jù)庫的詳細(xì)步驟,需要的朋友可以參考下2024-05-05
Golang科學(xué)計(jì)數(shù)法轉(zhuǎn)換string數(shù)字輸出的實(shí)現(xiàn)
最近接手一個(gè)商城運(yùn)單號(hào)模塊,接手后發(fā)現(xiàn)有部分運(yùn)單號(hào)返回給前端是按照科學(xué)計(jì)數(shù)法的方式返回,本文就介紹一下Golang科學(xué)計(jì)數(shù)法轉(zhuǎn)換string數(shù)字輸出,感興趣的可以了解一下2021-07-07
深入理解Golang?Channel?的底層結(jié)構(gòu)
這篇文章主要介紹了深入理解Golang?Channel?的底層結(jié)構(gòu),Go?語言的?channel?底層是什么數(shù)據(jù)結(jié)構(gòu)?下面我們就一起來深入解析一下?channel,需要的朋友可以參考下2022-01-01

