mysql - 如何从 Golang 中的 DAO 函数返回 mysql 查询错误
问题描述
我想将Query
一个 DAO 函数的 MySQL 错误返回给调用者。但是错误会创建一个panic
并停止程序。所以没有任何东西返回给调用者。DAQ功能如下
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
}
我的调用函数是这样的
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
我想处理错误并将其返回给调用者。但它会产生恐慌。如何将其传递给调用者函数?
解决方案
在 nil 错误检查之后移动 defer close func,例如:
if err != nil {
//code halts here. Nothing returns after here
return values, err
}
defer rows.Close()
推荐阅读
- lua - 如何在 openresty docker 镜像中安装 lua-resty-string?
- php - 根据选中的复选框值获取下拉列表选项
- unit-testing - 控制器测试中的 Grails 4.0 模拟服务方法
- javascript - 如何验证只有一个 CheckBoxFor 等于组的“真”
- swift - Python 到 Swift 的转换
- django - Runserver Django 在生产中成功,但无法访问站点。但是我可以通过 ngrok 隧道
- file-upload - 如何在量角器中使用 autoit 上传文件
- cookies - JMeter在同一迭代中的HTTP请求后清除cookie
- flutter - 为什么转换在发布模式下无法正常工作
- python - 从多个串行端口(GPS,通过 RS232 - USB 适配器)实时读取延迟