• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

使用Go语言实现try{}catch{}finally

武飞扬头像
ZWZhangYu
帮助1

示例

Java开发肯定都熟悉try{}catch{}finally,在使用Go语言实现前,我们需要先搞清楚这三个步骤的流程:
【1】先执行try代码块,然后是catch代码块,其次是finally代码块
【2】catch会在try代码块发生异常时执行,常用于捕获异常然后回滚事务
【3】三个代码块的内部互相独立,内部声明的对象变量不共享

package exception

import "fmt"

// 定义结构
type TcfBlock struct {
	Try     func()
	Catch   func(interface{})
	Finally func()
}

// 构建整体的执行流程,类似于模板方法的设计
func (b TcfBlock) Do() {
	fmt.Println("执行Do")
	if b.Finally != nil {
		defer b.Finally()
	}
	if b.Catch != nil {
		defer func() {
			if e := recover(); e != nil {
				b.Catch(e)
			}
		}()
	}
	b.Try()
}

上面定义了TcfBlock 的结构体,结构体里面有三个函数,这三个函数就对应的try{}catch{}finally的三个步骤,在下面的Do方法中构建了三个函数的执行流程,相当于模板方法设计,定义架构。

package main

import (
	"fmt"
	"practise/error/transaction/component"
)

// 测试try{}catch{}finally组件
func main() {
	component.TcfBlock{
		Try: func() {
			fmt.Println("执行Try代码")
			testError()
		},
		Catch: func(e interface{}) {
			testCatch(e)
		},
		Finally: func() {
			fmt.Println("执行Finally代码")
		},
	}.Do()
}

func testCatch(e interface{}) {
	fmt.Println("执行Catch代码")
}

func testError() {
	panic("模拟异常")
}

学新通

分析

【1】Recover 是一个Go语言的内建函数,可以让进入宕机流程中的 goroutine 恢复过来,recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果,如果当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,并且恢复正常的执行。上面的Catch代码中if e := recover(); e != nil 就是通过recover()来捕获测试代码中panic(“模拟异常”)的异常。这里需要注意Go中异常是通过返回值处理的,我们需要根据实际情况进行处理并抛出异常。
【2】goLang如果一个代码块有多个defer,那么按照后入先出的顺序,类似栈的数据结构,使用该特性可以实现catch和Finally的defer执行顺序,实现Finally在catch后面执行,并且可以保证二者都会执行。
【3】使用上述实现的try{}catch{}finally组件适用于数据库事务操作,可以将多个数据操作放在try里面并在catch捕获异常,然后确定事务提交或者事务回滚。
【4】参考如上的组件设计,可以实现一些固定模板架构的功能流程,这样整体的代码看起来也更加清晰

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfbhkk
系列文章
更多 icon
同类精品
更多 icon
继续加载