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)
}
在大多数情况下,这并不重要,因为操作由于某种原因失败了,无论如何您都需要处理它。只有当您想根据您真正需要检查的网络错误采取不同的操作时。
神不在的星期二
TA贡献1963条经验 获得超6个赞
这就是 go 的错误处理真正困扰我的地方。大多数情况下,实际的错误类型都没有记录,因此您必须查看源代码并检查代码可以返回哪些错误。在某些情况下,这些只是一般的字符串错误,因为代码是特定于平台的,因此,错误也是特定于平台的。
您可以这样做,检查源代码,或者您可以打印错误类型以确切知道它是哪一种。
log.Printf("%T", err)
- 2 回答
- 0 关注
- 214 浏览
添加回答
举报
0/150
提交
取消