繁体   English   中英

如何从 Golang 中的 DAO function 返回 mysql 查询错误

[英]How to return mysql Query error from a DAO function in Golang

我想将来自 DAO function 的 MySQL Query错误返回给调用者。 但是该错误会引起panic并停止程序。 所以没有任何东西返回给调用者。 DAQ function 如下

var sqlquery="SELECT idfrom table where id=?"

func (mdao DbConn) Daoprocess(tz *entities.Workflowentity) ([]entities.WorkflowResponseEntity, error) {
    log.Println("In side dao")
    values := []entities.WorkflowResponseEntity{}
    rows, err := mdao.DB.Query(sqlquery, tz.Id)
    defer rows.Close()
    if err != nil {
       //code halts here. Nothing returns after here
       return values, err
    }
   for rows.Next() {
       value := entities.WorkflowResponseEntity{}
        err:=rows.Scan(&value.Id)
       if err != nil {
          log.Print("Daoprocess Scan Error", err)
           return values, err
       }
       values = append(values, value)
   }
   return values, nil
}

我的来电者 function 就是这样

values, err1 := dataAccess.Daoprocess(tz)
log.Print("\n\n INSIDE MODEL")
log.Print(err1)
if err1 != nil {
    return t, false, err1, "Something Went Wrong"
}

错误是:

2021/03/17 15:41:14 http: panic serving [::1]:53440: runtime error: invalid memory address or nil pointer dereference
goroutine 6 [running]:
net/http.(*conn).serve.func1(0xc00010cb40)
    /usr/local/go/src/net/http/server.go:1801 +0x147
panic(0x8c7460, 0xc419e0)
    /usr/local/go/src/runtime/panic.go:975 +0x3e9
database/sql.(*Rows).close(0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/database/sql/sql.go:3155 +0x76
database/sql.(*Rows).Close(0x0, 0x0, 0x0)
    /usr/local/go/src/database/sql/sql.go:3151 +0x33
panic(0x8c7460, 0xc419e0)
    /usr/local/go/src/runtime/panic.go:969 +0x175
database/sql.(*Rows).Next(0x0, 0xa095e0)
    /usr/local/go/src/database/sql/sql.go:2835 +0x30
iFIX/ifix/dao.DbConn.Checkprocessdelete(0xc000071d40, 0xc0001167e0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /home/subham/Documents/Projects/go/iFIX/ifix/dao/workflowdao.go:85 +0x227
iFIX/ifix/models.Checkprocessdelete(0xc0001167e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /home/subham/Documents/Projects/go/iFIX/ifix/models/workflowmodel.go:350 +0x288
iFIX/ifix/handlers.Checkprocessdelete(0xa08c20, 0xc00017a0e0, 0xc00017e000)
    /home/subham/Documents/Projects/go/iFIX/ifix/handlers/workflowHandler.go:292 +0x237
net/http.HandlerFunc.ServeHTTP(0x9868d0, 0xa08c20, 0xc00017a0e0, 0xc00017e000)
    /usr/local/go/src/net/http/server.go:2042 +0x44
iFIX/ifix/router.PostMiddleware.func1(0xa08c20, 0xc00017a0e0, 0xc00017e000)
    /home/subham/Documents/Projects/go/iFIX/ifix/router/router.go:45 +0x659
net/http.HandlerFunc.ServeHTTP(0xc000178a00, 0xa08c20, 0xc00017a0e0, 0xc00017e000)
    /usr/local/go/src/net/http/server.go:2042 +0x44
net/http.(*ServeMux).ServeHTTP(0xc53460, 0xa08c20, 0xc00017a0e0, 0xc00017e000)
    /usr/local/go/src/net/http/server.go:2417 +0x1ad
net/http.serverHandler.ServeHTTP(0xc00017a000, 0xa08c20, 0xc00017a0e0, 0xc00017e000)
    /usr/local/go/src/net/http/server.go:2843 +0xa3
net/http.(*conn).serve(0xc00010cb40, 0xa095a0, 0xc000058300)
    /usr/local/go/src/net/http/server.go:1925 +0x8ad
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:2969 +0x36c

我想处理错误并将其返回给调用者。但它会产生恐慌。如何将其传递给调用者 function?

在 nil 错误检查之后移动 defer close func,例如:

if err != nil {
   //code halts here. Nothing returns after here
   return values, err
}
defer rows.Close()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM