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 · 4432 次点击
    这是一个创建于 397 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直用 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 是多返回值,绝大多数语言其实也都可以实现类似的方案。
    fenglangjuxu
        12
    fenglangjuxu  
       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 好在哪里?
    abcdexx
        14
    abcdexx  
       2023-10-23 09:48:51 +08:00
    我们 go 语言错误处理就是这样子的 (#^.^#)
    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 还是差一些
    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  
       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   ·   实用小工具   ·   2911 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:18 · PVG 11:18 · LAX 19:18 · JFK 22:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.