猿问

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

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:连接被拒绝


Smart猫小萌
浏览 215回答 2
2回答

子衿沉夜

网络错误将是满足net.Error接口的类型。if err, ok := err.(net.Error); ok {    log.Println("network error:", err)} else {    log.Println("other error:", err)}在大多数情况下,这并不重要,因为操作由于某种原因失败了,无论如何您都需要处理它。只有当您想根据您真正需要检查的网络错误采取不同的操作时。

神不在的星期二

这就是 go 的错误处理真正困扰我的地方。大多数情况下,实际的错误类型都没有记录,因此您必须查看源代码并检查代码可以返回哪些错误。在某些情况下,这些只是一般的字符串错误,因为代码是特定于平台的,因此,错误也是特定于平台的。您可以这样做,检查源代码,或者您可以打印错误类型以确切知道它是哪一种。log.Printf("%T", err)
随时随地看视频慕课网APP

相关分类

Go
我要回答