golang 延时函数defer 作final处理文件或异常
defer 函数先进后出原则,在函数内部使用时,会在return之后执行,所以根据这一特性,可以处理因为异常导致文件流未关闭问题(内存泄漏)和异常捕捉使用,具体如下:
文件流关闭
func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName)if err != nil {return} defer src.Close() // 此处就算后续因为异常return,也会执行此处的close()dst, err := os.Create(dstName)if err != nil {return} defer dst.Close()return io.Copy(dst, src) }
数据库查询关闭
resultIterator, err := stub.GetStateByPartialCompositeKey(DT_AGENT_COMMISSION_DATA,[]string{params.Agent_code,params.Period}) if err != nil { return ErrorPbResponse(RESP_CODE_SYSTEM_ERROR,err.Error()) } defer resultIterator.Close() //此处就算return或异常都会执行
用作异常捕捉,结合recover()捕获异常函数使用,类似java的final
func test(){ var exception interface{} temp("hello", func(e interface{}) { exception = e }) if exception != nil { fmt.Println(exception) } return} func temp(msg string, handler func(e interface{})){ defer func() { if err := recover(); err != nil { handler(err) } }() fmt.Println(msg[len(msg)+1])//异常 return} func main() { test() }
作者:李孝伟
链接:https://www.jianshu.com/p/9d25cf8dd9f2
點(diǎn)擊查看更多內(nèi)容
為 TA 點(diǎn)贊
評(píng)論
評(píng)論
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦