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函數(shù)中,如果mysql和客戶端的連接斷開,stmt.Exec就會失敗,會返回一個錯誤,我如何區(qū)分連接錯誤和其他錯誤。(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 失?。篻etsockopt:連接被拒絕 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 失?。篻etsockopt:連接被拒絕
2 回答

子衿沉夜
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個贊
網(wǎng)絡(luò)錯誤將是滿足net.Error接口的類型。
if err, ok := err.(net.Error); ok {
log.Println("network error:", err)
} else {
log.Println("other error:", err)
}
在大多數(shù)情況下,這并不重要,因?yàn)椴僮饔捎谀撤N原因失敗了,無論如何您都需要處理它。只有當(dāng)您想根據(jù)您真正需要檢查的網(wǎng)絡(luò)錯誤采取不同的操作時。

神不在的星期二
TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個贊
這就是 go 的錯誤處理真正困擾我的地方。大多數(shù)情況下,實(shí)際的錯誤類型都沒有記錄,因此您必須查看源代碼并檢查代碼可以返回哪些錯誤。在某些情況下,這些只是一般的字符串錯誤,因?yàn)榇a是特定于平臺的,因此,錯誤也是特定于平臺的。
您可以這樣做,檢查源代碼,或者您可以打印錯誤類型以確切知道它是哪一種。
log.Printf("%T", err)
- 2 回答
- 0 關(guān)注
- 252 瀏覽
添加回答
舉報
0/150
提交
取消