golang 的错误处理真的很糟糕 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yaott2020
V2EX    Go 编程语言

golang 的错误处理真的很糟糕

  •  
  •   yaott2020 2023-10-22 12:00:01 +08:00 via Android 5030 次点击
    这是一个创建于 723 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直用 golang ,一直有人吐槽 golang 错误处理很繁琐,一开始觉得还好,直到遇见了 rust 。不得不说 rust 错误处理真的很优雅。写了一段时间 rust 反过来写 golang ,繁琐感瞬间就出来了

    第 1 条附言    2023-10-24 10:38:15 +08:00
    补充:我个人对 go 错误返回形式没什么太大意见(相比 try-catch 来说已经很不错了),让我觉得反感的是一遍又一遍的 if err != nil { return nil, err } 。我个人希望可以参考 rust 的返回处理方式,增加一点语法糖,比如? map_err
    33 条回复    2023-10-25 21:23:28 +08:00
    equationzhao
        1
    equationzhao  
       2023-10-22 12:07:51 +08:00
    确实,看过 rust 就觉得 go 的 err 有点...
    Goooooos
        2
    Goooooos  
       2023-10-22 15:11:22 +08:00 via Android
    我见过吐槽 go 的 err 的,下都都会用 java 来反驳,来证明 go 的 err 是最优雅的
    learningman
        3
    learningman  
       2023-10-22 15:31:27 +08:00
    Box<dyn Error> 一把梭是吧

    其实 go 里你是能实现 rust 风格的 error 处理的,pattern matching 不好整,.unwrap 啥的你可以 replace error 搞
    atVoid
        4
    atVoid  
       2023-10-22 15:41:00 +08:00
    https://github.com/morrisxyang/errors, 这里实现了 wrap, unwrap 等常见能力, 添加了错误码和堆栈的支持.
    rust 的 pattern matching 可以给我一些 example 和资料吗? 我看看是否可以添加.
    @yaott2020
    thevita
        5
    thevita  
       2023-10-22 16:49:54 +08:00
    现在 go 错误处理比刚出来的时候好多了,繁琐是有点,但是没啥心智负担(对写应用来说),只是和 rust 比起来显得有点草率,基本和 rust 无脑 anyhow::Error 一样
    unnamedhao
        6
    unnamedhao  
       2023-10-22 20:40:25+08:00
    if err != nil
    cyp0633
        7
    cyp0633  
       2023-10-23 00:05:11 +08:00   4
    感觉,rust>go>其他绝大部分 try-catch
    studyrun
        8
    studyrun  
       2023-10-23 00:53:30 +08:00
    大道至简 警告[滑稽]
    fdwjtz
        9
    fdwjtz  
       2023-10-23 01:12:06 +08:00
    接触 go 之前一直写 c ,go 这种错误处理方式倒觉得挺适应的
    herozzm
        10
    herozzm  
       2023-10-23 08:16:21 +08:00
    try-catch 比 go 的 error 更恶心
    pursuer
        11
    pursuer  
       2023-10-23 08:51:04 +08:00
    try-catch 多被用于异常处理,控制流来说是快速返回调用栈的作用(stack unwinding),C 里也有类似的 setjmp,longjmp 机制。
    而 go 里 error 是多返回值,绝大多数语言其实也都可以实现类似的方案。
    keepfun
        12
    keepfun  
       2023-10-23 09:16:51 +08:00
    @herozzm 同意 java 到处充斥这个 try catch 一层套一层
    bli22ard
        13
    bli22ard  
       2023-10-23 09:27:35 +08:00
    golang 的很糟糕,rust 比 golang 好在哪里?
        14
    abcdexx  
       2023-10-23 09:48:51 +08:00
    我们 go 语言错误处理就是这样子的 (#^.^#)
    abcdexx
    trzzzz
        15
    trzzzz  
       2023-10-23 09:50:44 +08:00
    golang 官方解释说:异常也被认为是一种返回值类型
    kingbill
        16
    kingbill  
       2023-10-23 10:48:48 +08:00
    Java 的 try catch 不是能在最外层统一处理吗?我感觉这样挺省事的啊,反而是 go 每一层都要 if err != nil 感觉很唆
    PTLin
        17
    PTLin  
       2023-10-23 11:29:22 +08:00
    月经贴了属于是
    Winrey
        18
    Winrey  
       2023-10-23 11:29:30 +08:00
    个人觉得 java 的报错摆烂处理方便些; golang 精确处理方便些

    rust 怎么都方便
    yaott2020
        19
    yaott2020  
    OP
       2023-10-23 11:49:13 +08:00 via Android
    @trzzzz 意思是直接 panic 抛出然后拿个 defer recover 统一处理?
    yaott2020
        20
    yaott2020  
    OP
       2023-10-23 11:50:33 +08:00 via Android
    @atVoid rust 主要是有个 Result 枚举类型,以及语法糖'?',再加上一些 map_err unwrap_or 函数之类的,go 能做吗?
    yaott2020
        21
    yaott2020  
    OP
       2023-10-23 11:51:34 +08:00 via Android
    @cyp0633 确实,相比 try-catch ,go 的错误处理相对好很多了,但比 rust 还是差一些
    div id="r_13815138" class="cell">
    mmdsun
        22
    mmdsun  
       2023-10-23 13:04:22 +08:00 via iPhone
    @fenglangjuxu
    @herozzm

    很多语言都是 try catch 那套吧? Java 主要是检查性异常必须捕获就很恶心了,但是现在也可以用 lombok 插件加个 @SneakyThrows
    BBCCBB
        23
    BBCCBB  
       2023-10-23 14:35:01 +08:00
    go 的 if err != nil {} 比 java 的 try catch 难用多了.. 这玩意儿每个地方都要强制 if err!=nil {}一波

    rust 的还可以. 毕竟可以? 直接往外面传播. 可以在最外层统一处理.
    hancai
        24
    hancai  
       2023-10-23 16:34:05 +08:00
    用习惯了,没感觉,配合 Copilot 就一个 tab 的事情
    wei2629
        25
    wei2629  
       2023-10-23 17:22:02 +08:00
    是繁琐 但是 try-catch 怎么判断 到底错误在什么地方出现呢?难道随时打开堆栈信息吗?
    littlewing
        26
    littlewing  
       2023-10-23 19:12:39 +08:00
    写 C 的表示没啥
    hellodudu86
        27
    hellodudu86  
       2023-10-23 21:00:32 +08:00
    Do you guys not write c??
    trzzzz
        28
    trzzzz  
       2023-10-24 08:30:18 +08:00 via iPhone
    @yaott2020 不是啊 你就当异常是一个返回值。比如方法需要返回 int ,但方法里面处理可能会异常,那么你就在该方法加一个返回值变成 func method() (int, error)
    anubis482
        29
    anubis482  
       2023-10-24 09:40:10 +08:00
    @BBCCBB ?出来的问题我记得是 panic ,在外层统一处理就和 try-catch 无异了,失去了 Result 的灵魂
    BBCCBB
        30
    BBCCBB  
       2023-10-24 10:04:37 +08:00
    @anubis482 rust ? 是直接返回啊. Err 往上层传播

    再灵魂也不能每个地方都去 match res {
    ok -> xxx,
    err -> xxx
    }
    darksword21
        31
    darksword21  
    PRO
       2023-10-24 10:20:52 +08:00
    无感,基本还没写过 try catch 的语言,go 的这种就感觉挺符合直觉的,当然觉得应该还有改善空间。。
    cp19890714
        32
    cp19890714  
       2023-10-24 10:27:13 +08:00
    我觉得, return error 和 try catch 的应用场景有差异, 各有优势, 语言应该同时提供这两种, 由程序员自己决定用哪种.
    atVoid
        33
    atVoid  
       2023-10-25 21:23:28 +08:00
    @yaott2020 让我来看一下,如果是泛型的话 或许可以
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2499 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 15:42 PVG 23:42 LAX 08:42 JFK 11:42
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86