教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go语言中的try、catch、throw实现

go语言中的try、catch、throw实现

发布时间:2023-03-07   编辑:jiaochengji.com
教程集为您提供go语言中的try、catch、throw实现等资源,欢迎您收藏本站,我们将为您提供最新的go语言中的try、catch、throw实现资源
func (o *MsSqlUtils) ExecuteSql(cmd string) (err1 error, affected int64) {
	defer func() { //必须要先声明defer,否则不能捕获到panic异常
		if err2 := recover(); err2 != nil {
			err1 = fmt.Errorf("internal error: %v", err2)
		}
	}()
	stmt, err := o.Db.Prepare(cmd)
	checkErr(err)
	var res sql.Result
	res, err1 = stmt.Exec()
	checkErr(err1)
	if err1 != nil {
		affected, err1 = res.RowsAffected()
	}
	return
}

函数中的defer中调用了recover(),获取错误,并作为函数的返回值。

go中很多函数有error类型的返回值,如果希望以异常的形式抛出,可以调用panic让recover函数捕获,如:

func (o *MsSqlUtils) ExecuteWithTrans(callback TransCallback) (err1 error) {
	defer func() { //必须要先声明defer,否则不能捕获到panic异常
		if err2 := recover(); err2 != nil {
			err1 = fmt.Errorf("internal error: %v", err2)
		}
	}()
	trans, _ := o.Db.Begin()
	err := callback(o)
	if err == nil {
		trans.Commit()
	} else {
		trans.Rollback()
		panic(err)
	}
	return
}

这里callback是函数调用者编写的函数,如果其中有错误发生,则使用panic抛出异常,让上面的recover捕获。

或采用网上的封装,模拟C 的方式:

package try

import "reflect"

// Try catches exception from f
func Try(f func()) *tryStruct {
    return &tryStruct{
        catches: make(map[reflect.Type]ExeceptionHandler),
        hold:    f,
    }
}

// ExeceptionHandler handle exception
type ExeceptionHandler func(interface{})

type tryStruct struct {
    catches map[reflect.Type]ExeceptionHandler
    hold    func()
}

func (t *tryStruct) Catch(e interface{}, f ExeceptionHandler) *tryStruct {
    t.catches[reflect.TypeOf(e)] = f
    return t
}

func (t *tryStruct) Finally(f func()) {
    defer func() {
        if e := recover(); nil != e {
            if h, ok := t.catches[reflect.TypeOf(e)]; ok {
                h(e)
            } else {
                f()
            }
        }
    }()

    t.hold()
}

//demo
import (
    "log"
    "try"
)

func main() {
    try.Try(func() {
        panic("123")
    }).Catch(1, func(e interface{}) {
        log.Println("int", e)
    }).Catch("", func(e interface{}) {
        log.Println("string", e)
    }).Finally(func() {
        log.Println("finally")
    })
}

 

到此这篇关于“go语言中的try、catch、throw实现”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
再次学习try catch finally
使用php异常处理类Exception的例子
java 7中捕获多个异常示例分析
PHP异常处理类BADMETHODCALLEXCEPTION使用方法
java编程中捕获多个异常try实例
php中try catch 捕获异常的例子
go学习(十二)——Go 语言错误与异常处理机制
golang中的defer panic recover
php异常捕获try catch实例解析
C#数据库操作小结

[关闭]
~ ~