关于 Golang 不处理数据库操作的 error 的一点思考

2023-10-20 14:38:42 +08:00
 maotao456

事情的起因是这样的。 一个方法要查询 N 次数据库,每一次查询都要 if err , 我实在受不了啦,思索一番后觉得 似乎并不需要在运行时处理数据库操作的 error 。结论如下:

因为运行时的 error 大概率是连接,基建问题。 如果是 sql 语句问题,早就该在测试环节就发现。 既然是连接问题,那么一个查询报错,其它所有查询都会报错, 所以在每一个查询的地方都做 err check 是没有意义的。

可是不处理 err 怎么知道数据库有问题呢,怎么保证业务的完整呢?我大概理出了三板斧:

  1. query 的操作不处理 err ,sql 问题留到测试期解决
  2. update, insert 类操作要处理 err, 保证数据安全
  3. 对这些操作做一层包装和封装,每次调用记录 error ,监控该报警报警

当然,我不确定我这个想法是否考虑周到,可能以偏概全了。 欢迎大家一起讨论一下。

2910 次点击
所在节点    Go 编程语言
38 条回复
qq976739120
2023-10-20 14:40:43 +08:00
不要忽略任何错误.哪怕打个日志也好. 用上模板写个 if err 也就一秒. 万一出问题帮你节省的时间起码几小时.
28Sv0ngQfIE7Yloe
2023-10-20 14:42:05 +08:00
之前写 gorm 的时候,无查询结果时也会有 err 不知道现在是什么样了
codehz
2023-10-20 15:03:16 +08:00
数据库查询错误,可能是数据库迁移没做好,这个测试环境可能无法复现(因为生产环境和测试环境很有可能用的不是同一个数据库,注意这里的错误不一定指的是某个表不存在,而是说可能出现一些异常数据导致查询错误)
lsk569937453
2023-10-20 15:13:18 +08:00
必须要每个 error 都处理。

我就说一个最简单的场景,一个请求进来,判断是不是合法用户(根据 token 查询数据库中是否存在),如果不存在,则在爬虫表里记录该请求的信息。
伪代码大概如下:

var count int64
err1 := dao.TestDb.Model(&dao.UserDao{}).Count(&count).Error
//用户信息表里没有,则记录爬虫
if count==0{
err2:= dao.TestDb.Create(userDao)
}

如果一个合法用户的请求进来,因为网络抖动出错了,也会导致 count=0 并且 err1 不为空,你没有处理 err1,所以后面 insert 成功了(你无法猜测网络波动的时间,只能尽可能的去处理所有的 error)。
hellodudu86
2023-10-20 15:24:45 +08:00
线上出现问题的时候,你就会后悔没有每个 err 都处理并打印日志了
inhzus
2023-10-20 15:25:36 +08:00
写代码一时爽,查线上问题火葬场
mcfog
2023-10-20 15:36:43 +08:00
goland 生产力搞起,输入
err.rr
按 tab
见证奇迹
guanzhangzhang
2023-10-20 16:41:50 +08:00
每个 err 都要处理,更何况设计到网络这种的
liyunlong41
2023-10-20 16:44:42 +08:00
很多因素会导致数据库报错,cpu 、内存、磁盘、其它慢 sql 影响、db 的定时任务、机器老化等。甚至使用的 orm 库可能有 bug ,导致某些正常连接有问题。建议还是每个错误都捕获,写 err 麻烦的话,goland 敲 err 然后直接 tab 键就自动补全了。
chaleaochexist
2023-10-20 16:44:45 +08:00
在 copilot 的帮助下, 没有太大问题.
考虑到费用问题, 也有很多免费的替代, 今天北大刚出了一款类似产品.
dobelee
2023-10-20 16:46:23 +08:00
查线上问题的时候你把不得每行一条 log 。
monster1priest
2023-10-20 17:05:38 +08:00
能处理就处理,处理不了就抛出去,但是永远不要吞异常,
k9982874
2023-10-20 17:08:56 +08:00
一楼说的没错,你起码要打个 log ,不然线上出问题,找到你这你说不清楚这锅就得你背
Sendya
2023-10-20 17:19:17 +08:00
@Morii First Last 查询 API 为单条查询设计,查询不到时会 ErrRecordNotFound 错误,使用 Take API 查询单条时,查询不到不会报错。应该是使用 API 的问题
28Sv0ngQfIE7Yloe
2023-10-20 17:24:10 +08:00
@Sendya 那可能是我对 Gorm 不熟悉的问题
zhangyq008
2023-10-20 17:36:39 +08:00
没必要,err 该处理处理
ychost
2023-10-20 17:42:52 +08:00
还是打印日志为妙
CEBBCAT
2023-10-20 17:54:09 +08:00
有一些 fail fast 的文档,这会儿时间不多,可以 Google 「 program design check error rare panic OR fail 」
dw2693734d
2023-10-20 17:59:48 +08:00
其实 postgres 已经把错误日志收集了
dqzcwxb
2023-10-20 18:06:05 +08:00
谢谢你对测试的信任

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/983809

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX