为了账号安全,请及时绑定邮箱和手机立即绑定

使用 go-sql-driver 时如何区分连接错误和其他错误

使用 go-sql-driver 时如何区分连接错误和其他错误

Go
Smart猫小萌 2021-12-07 16:43:14
func mainloop(db *sql.DB) {        type pushTask struct {            TaskId string            Uri    string        }        stmt, err := db.Prepare("INSERT INTO ErrPushCache(TaskId, Uri) VALUES(?, ?)")        if err != nil {            log.Fatal("db.Prepare Failed ", err)        }        var (            mysqlOk bool = true            task    pushTask        )        for {            task.TaskId = RandStringRunes(8)            task.Uri = RandStringRunes(16)            res, err := stmt.Exec(task.TaskId, task.Uri)            if err != nil {                if err == driver.ErrBadConn {                    if mysqlOk {                        log.Print("Connection with mysql seems down, %s", err.Error())                        mysqlOk = false                        os.Exit(1)                    }                } else {                    log.Print("Exec failed ", err)                }                time.Sleep(2 * time.Second)                continue            }            if !mysqlOk {                log.Print("Connection with mysql is ok now")                mysqlOk = true            }            lastId, err := res.LastInsertId()            if err != nil {                log.Print("LastInsertId failed ", err)            }            rowCnt, err := res.RowsAffected()            if err != nil {                log.Print("RowsAffected failed ", err)            }            log.Printf("ID = %d, affected = %d\n", lastId, rowCnt)            time.Sleep(20 * time.Second)        }    }在mainloop函数中,如果mysql和客户端的连接断开,stmt.Exec就会失败,会返回一个错误,我如何区分连接错误和其他错误。(err == driver.ErrBadConn总是false)。如果连接中断,则日志为:2016/01/29 17:21:31 Exec 拨号 tcp 192.168.1.61:3306 失败:getsockopt:连接被拒绝 2016/01/29 17:21:33 Exec 拨号 tcp 192.168.1.61:3016 连接被拒绝失败01/29 17:21:35 Exec 拨号 tcp 192.168.1.61:3306 失败:getsockopt:连接被拒绝 2016/01/29 17:21:37 Exec 拨号 tcp 192.168.1.61:3306 失败:getsockopt/getsockopt/连接被拒绝29 17:21:39 Exec 拨号 tcp 192.168.1.61:3306 失败:getsockopt:连接被拒绝
查看完整描述

2 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

网络错误将是满足net.Error接口的类型。


if err, ok := err.(net.Error); ok {

    log.Println("network error:", err)

} else {

    log.Println("other error:", err)

}

在大多数情况下,这并不重要,因为操作由于某种原因失败了,无论如何您都需要处理它。只有当您想根据您真正需要检查的网络错误采取不同的操作时。


查看完整回答
反对 回复 2021-12-07
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

这就是 go 的错误处理真正困扰我的地方。大多数情况下,实际的错误类型都没有记录,因此您必须查看源代码并检查代码可以返回哪些错误。在某些情况下,这些只是一般的字符串错误,因为代码是特定于平台的,因此,错误也是特定于平台的。

您可以这样做,检查源代码,或者您可以打印错误类型以确切知道它是哪一种。

log.Printf("%T", err)


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信