用golang模拟try/catch的最佳方法是什么

6ovsh4lw  于 5个月前  发布在  Go
关注(0)|答案(3)|浏览(63)

在golang中模拟try/catch的最佳方法是什么?

db.Attach(dbFile)
try {
   db.Exec(sql1);
   db.Exec(sql2);
   db.Exec(sql3);
} catch (SQLExecption e) {
    throw new Error("sql error in executing " + dbFile + " ", e);
}

字符串
要在Golang做到这一点,我必须做一些事情,

db.Attach(dbFile)
var err error
if err = db.Exec(sql1); err != nil {
   log.Panic(fmt.Sprintf("error in attaching db %s error : %s", dbFile, err))
}
if err = db.Exec(sql2); err != nil {
   log.Panic(fmt.Sprintf("error in attaching db %s error : %s", dbFile, err))
}
if err = db.Exec(sql3); err != nil {
   log.Panic(fmt.Sprintf("error in attaching db %s error : %s", dbFile, err))
}


我可以把它缩短成

db.Attach(dbFile)
db.MustExec(sql1)
db.MustExec(sql2)
db.MustExec(sql3)


但是我无法在错误消息中获得有关附加数据库的信息。如何在不太冗长的情况下实现try/catch的效果,而不是将SQL语句放在拼接中并循环它。
先谢了。

b4wnujal

b4wnujal1#

看看典型的(C++,Python,Java..)异常,异常处理有两个方面:

  • 函数不会返回“常规”值,而是返回一个异常。
  • 控制流采用不同的路径。

你可以在Go中单独做这些事情。
对于返回值与异常作为函数结果,典型的Go语言习惯是返回一个元组。如果你在有异常的语言中返回一个string,在Go语言中你返回string, error。如果你的函数成功,(return的等价物),你在Go中使用return "some string", nil。如果失败,你返回nil, some_errorfmt.Errorf()函数帮助创建这些error示例。另外,你猜对了,异常类被替换为Go的error
对于控制流,没有什么内在的东西可以使用。习惯用法是检查返回的元组是否其error元素不是nil。如果是,您只需返回到调用函数,转发返回的错误。如果您想要返回更具体的error实现,(相当于异常 Package /链接),您只需使用现有的error创建它。
这可能看起来很烦人,因为它只适用于return,而不是本地,但请记住,您始终可以使用例如defer来定义后记代码,也可以使用本地函数(“闭包”)来构建代码。

nszi6y05

nszi6y052#

在Go语言中,你可以像捕捉异常一样捕捉panic。
虽然不建议取代手动错误处理,但这是可能的。

func catchme() {
    panic("oh no!")
}

func main() {
    defer func() {
        if err := recover(); err != nil {
            log.Println("panic occurred:", err)
        }
    }()

    catchme()
}

字符串

blmhpbnm

blmhpbnm3#

为此,我编写了一个库:https://gitlab.com/reda.bourial/catch
以下是如何捕获错误:

panicked,err:=Panic(func(){
  // You SQL queries go here
})
``

字符串

相关问题