didi / gendry

a golang library for sql builder
Apache License 2.0
1.62k stars 195 forks source link

使用scanner.ScanClose引起的panic #21

Closed cnlisea closed 6 years ago

cnlisea commented 6 years ago

最近项目更新依赖后(vendor),测试环境环境大量的panic,更新之前线上一切正常

Panic: runtime error: invalid memory address or nil pointer dereference
goroutine 33 [running]:
centerserver    | runtime/debug.Stack(0x48, 0x0, 0x0)
centerserver    |   /usr/local/go/src/runtime/debug/stack.go:24 +0xa7
centerserver    | runtime/debug.PrintStack()
centerserver    |   /usr/local/go/src/runtime/debug/stack.go:16 +0x22
centerserver    | be/vendor/github.com/go-chi/chi/middleware.Recoverer.func1.1(0xc4200a4600, 0xc28fa0, 0xc42013c1c0)
centerserver    |   /go/src/be/vendor/github.com/go-chi/chi/middleware/recoverer.go:28 +0x1b6
centerserver    | panic(0xa53520, 0xef3f50)
centerserver    |   /usr/local/go/src/runtime/panic.go:502 +0x229
centerserver    | be/vendor/github.com/didi/gendry/scanner.CloseErr.Error(0x0, 0x0, 0x0, 0x0)
centerserver    |   /go/src/be/vendor/github.com/didi/gendry/scanner/scanner.go:117 +0x22

查看更新记录后发现ScanClose方法更新了 更新前

func ScanClose(rows Rows, target interface{}) error {
    err := Scan(rows, target)
    if nil != rows {
        if nil == err {
            err = rows.Close()
               }
    }
    return err
}

更新后

func ScanClose(rows Rows, target interface{}) error {
    err := Scan(rows, target)
    if nil != rows {
        errClose := rows.Close()
        if err == nil {    //  ==> if errClose != nil {
            err = newCloseErr(errClose)
        }
    }
    return err
}

panic原因: 系统在调用ScanClose后获取返回的err, 并在后续代码中使用了err.Error()引起此问题

caibirdme commented 6 years ago

@cnlisea 谢谢指正,master已修复