在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语句放在拼接中并循环它。
先谢了。
3条答案
按热度按时间b4wnujal1#
看看典型的(C++,Python,Java..)异常,异常处理有两个方面:
你可以在Go中单独做这些事情。
对于返回值与异常作为函数结果,典型的Go语言习惯是返回一个元组。如果你在有异常的语言中返回一个
string
,在Go语言中你返回string, error
。如果你的函数成功,(return
的等价物),你在Go中使用return "some string", nil
。如果失败,你返回nil, some_error
。fmt.Errorf()
函数帮助创建这些error
示例。另外,你猜对了,异常类被替换为Go的error
。对于控制流,没有什么内在的东西可以使用。习惯用法是检查返回的元组是否其
error
元素不是nil
。如果是,您只需返回到调用函数,转发返回的错误。如果您想要返回更具体的error
实现,(相当于异常 Package /链接),您只需使用现有的error
创建它。这可能看起来很烦人,因为它只适用于
return
,而不是本地,但请记住,您始终可以使用例如defer
来定义后记代码,也可以使用本地函数(“闭包”)来构建代码。nszi6y052#
在Go语言中,你可以像捕捉异常一样捕捉panic。
虽然不建议取代手动错误处理,但这是可能的。
字符串
blmhpbnm3#
为此,我编写了一个库:https://gitlab.com/reda.bourial/catch
以下是如何捕获错误:
字符串