V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
voidmnwzp
V2EX  ›  Go 编程语言

有没有强迫症所有 err 必须处理的?

  •  
  •   voidmnwzp ·
    NullpointerW · 2022-08-22 12:32:49 +08:00 via iPhone · 4000 次点击
    这是一个创建于 830 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码堆多了就不想处理,但看着满屏的警告就难受,处理了又是满屏的 if err 更难受了 v6AJHg.png

    第 1 条附言  ·  2022-08-22 17:42:46 +08:00

    封装了下 观感提升但依旧治标不治本 v6JRmQ.png

    31 条回复    2022-09-14 07:53:16 +08:00
    codehz
        1
    codehz  
       2022-08-22 12:52:16 +08:00
    你这所谓处理,问题也不小啊
    截图中第一个,输出 err 之后,又输出 ok ?
    kkeep
        2
    kkeep  
       2022-08-22 12:53:24 +08:00 via Android
    哈哈,if err != nil 要记得 return
    kkeep
        3
    kkeep  
       2022-08-22 12:53:55 +08:00 via Android
    HTTPHandler 里面一般要把 err 转换成 json 返回
    voidmnwzp
        4
    voidmnwzp  
    OP
       2022-08-22 12:59:28 +08:00 via iPhone
    @codehz 这是我刚写完的代码 还没 review 就不用纠结了吧。。。
    Vegetable
        5
    Vegetable  
       2022-08-22 13:05:50 +08:00
    不知道你能决定的尺度有多大,至少你这个两个 handler 里应该是 reader->bordcast/push 的操作在设计上就不够优雅,导致代码写起来多余的东西很多。包括你用比较底层的 http 而不是封装过的框架,也产生了很多噪声。

    还有一些提升空间,但是总体来说 go 的代码就是这样的,忍着吧
    statumer
        6
    statumer  
       2022-08-22 13:09:05 +08:00 via iPhone   ❤️ 1
    建议学习 option monad
    出现错误应该往上抛并处理现场,大多数时候并不存在需要当场处理错误的情况。
    Nitroethane
        7
    Nitroethane  
       2022-08-22 13:30:34 +08:00
    单纯交流讨论下 op 的代码,以下是我的看法:1 )少用或避免使用 ioutil.ReadAll() 函数; 2 ) 33 行 byte slice 转 string 有性能开销,应该考虑将 httpPush.Adapter.Broadcast() 方法的参数改为 byte slice 并修改相关代码; 3 ) 48 行 json 反序列化时用 json.Decoder 更好; 4 )状态码用 http package 中定义的常量;
    iseki
        8
    iseki  
       2022-08-22 13:41:13 +08:00   ❤️ 1
    看看,这就是没有异常机制后,好多 Go 用户说的 [优雅的错误处理] (暴论
    ------------------
    个人的习惯是,除非理由很充分,否则永远不要用 _ 忽略错误。其次已经 err 的就不要 OK 了,大部分 err 都是现场无法处理的,往上抛,视情况决定要不要 wrap 一下加点信息,否则出了问题没法查。除非理由充分,否则永远不要 err 了还按正常流程返回结果,否则大概率会出了问题都不知道。
    Gota
        9
    Gota  
       2022-08-22 14:03:16 +08:00
    几周前刚看过一篇博客谈为什么 Go 默认的 HttpHandler 不适合直接拿来用,其中一个原因就是错误处理后容易忘返回。https://preslav.me/2022/08/09/i-dont-like-golang-default-http-handlers/

    建议还是找个轻量级的 HTTP 框架,毕竟中间件、路由之类的最后还是会用到的。
    tianyou666shen
        10
    tianyou666shen  
       2022-08-22 14:04:42 +08:00
    复制黏贴 if err != nil
    要不哪里报错找不到提示 真的要 g

    另外你感觉 err 处理里面的重复代码多,可以进行分层
    controller: 处理参数,转发到 model 或者 handler 的方法,根据是否 err 输出响应
    model/handler:接收参数,有错就 return err,让上一层处理 code,msg 等返回的具体内容

    这样可以减少很多直接 err!=nil 后,设置响应 code 的代码
    ClarkAbe
        11
    ClarkAbe  
       2022-08-22 14:39:46 +08:00
    io/ioutil 这个 package 已经标记弃用了.......
    sxfscool
        12
    sxfscool  
       2022-08-22 15:06:10 +08:00 via Android
    可以保证不会 err 的才忽略
    zmqiang
        13
    zmqiang  
       2022-08-22 15:22:34 +08:00
    由几次痛苦的 debug 经历都是来自随意忽略 err 或者是输出不明所以的日志,导致 debug 的过程中只能一行一行代码的过,没法很快发现问题。对于多人维护的系统来说,速错是一个很好的选择。
    Trim21
        14
    Trim21  
       2022-08-22 15:42:27 +08:00 via Android
    最起码在 http.Handler 外面再包一层,加个统一的错误处理统一处理 error 的,然后写 API 的时候遇到 error 就可以直接返回 /包一下对应的 http code 再返回。标准库那个实在是难用。
    fregie
        15
    fregie  
       2022-08-22 15:49:29 +08:00
    认真处理每个错误才是最优雅的,也最好读的.只是写的时候比较难受
    ruanimal
        16
    ruanimal  
       2022-08-22 16:11:44 +08:00
    @statumer golang 这个咋搞 option monad
    junmoxiao
        17
    junmoxiao  
       2022-08-22 16:14:03 +08:00
    如果是用到了外部资源的肯定要处理,用不到外部资源的忽略了无所谓
    cloverstd
        18
    cloverstd  
       2022-08-22 17:09:05 +08:00
    只要你有 IO 或者有 syscall ,都可能出现 error 的,写代码本来就是在处理各种异常情况,只看你忽略了错误对你业务有没有影响,忽略错误也是一种处理异常的方式
    akira
        19
    akira  
       2022-08-22 17:20:33 +08:00
    这么写。。10 行业务代码怕不是要带上 30 行的 错误处理了
    voidmnwzp
        20
    voidmnwzp  
    OP
       2022-08-22 17:31:56 +08:00 via iPhone
    @ClarkAbe 有什么代替的吗
    yousabuk
        21
    yousabuk  
       2022-08-22 18:20:30 +08:00 via iPhone
    不是啥强迫症

    应该是太闲了
    zhuangzhuang1988
        22
    zhuangzhuang1988  
       2022-08-22 18:55:39 +08:00
    放弃吧
    没有异常处理 就需要这么处理
    异常不是拍脑袋想的,有很多原因的 具体可以看下 c++老爹的《 C++语言的设计和演化》 异常部分
    securityCoding
        23
    securityCoding  
       2022-08-22 21:35:40 +08:00
    打印 err 日志往上抛即可,不要把 err 吞了
    reallittoma
        24
    reallittoma  
       2022-08-22 22:30:31 +08:00
    go 这么设计就是为了让你每个 err 都处理吧?
    wheeler
        25
    wheeler  
       2022-08-23 01:21:29 +08:00 via iPhone
    echo 的错误处理可以借鉴一下。
    shynome
        26
    shynome  
       2022-08-23 08:17:32 +08:00 via Android
    try.To1(
    Io.Readall())

    https://github.com/lainio/err2
    charmToby
        27
    charmToby  
       2022-08-23 09:09:22 +08:00
    看着好难受,建议还是用个 web 框架吧
    ClarkAbe
        28
    ClarkAbe  
       2022-08-23 09:16:45 +08:00 via Android
    @voidmnwzp 在 1.19 里面 io 和 os 包有了 ioutil 的全部功能
    lazyfighter
        29
    lazyfighter  
       2022-08-23 09:27:13 +08:00
    没怎么写过 go , 不过你这个代码是真的不具备观赏性, 看着老别扭了
    cmdOptionKana
        30
    cmdOptionKana  
       2022-08-23 09:35:37 +08:00
    解决办法很简单,用 Goland 即可,输入可自动化,显示也可简化。
    webcape233
        31
    webcape233  
       2022-09-14 07:53:16 +08:00 via iPhone
    goland 会贴心帮你自动写上
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2105 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:27 · PVG 08:27 · LAX 16:27 · JFK 19:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.