A 函数调用 B 函数,有没有可能在 B 不主动返回 error 的情况下,知道 B 执行过程中是否遇到了 error? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
zhoudaiyu
V2EX    Go 编程语言

A 函数调用 B 函数,有没有可能在 B 不主动返回 error 的情况下,知道 B 执行过程中是否遇到了 error?

  •  
  •   zhoudaiyu
    PRO
    2021-02-06 22:18:12 +08:00 3056 次点击
    这是一个创建于 1783 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 B 的定义是 func b() {} 不返回 error 。

    15 条回复    2021-02-07 19:42:19 +08:00
    icebay
        1
    icebay  
       2021-02-06 22:22:25 +08:00
    panic 和 recovery 满足吗?
    zhoudaiyu
        2
    zhoudaiyu  
    OP
    PRO
       2021-02-06 22:30:01 +08:00 via iPhone
    @IceBay #1 老哥怎么说 刚开始用 Go 还不太懂 panic 和 error 的关系
    treemonster
        3
    treemonster  
       2021-02-06 22:58:34 +08:00 via Android
    比如用 chan?
    cmdOptionKana
        4
    cmdOptionKana  
       2021-02-06 23:02:07 +08:00
    @zhoudaiyu 如果在 B 里发生 error 并且 panic, 那么在 A 里就可以通过 recover 来捕获 panic
    alazysun
        5
    alazysun  
       2021-02-06 23:54:09 +08:00
    go panic
    c++ throw
    Dongxiem
        6
    Dongxiem  
       2021-02-07 00:46:45 +08:00
    panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码,并在当前 Goroutine 中递归执行调用方的 defer ;

    recover 可以中止 panic 造成的程序崩溃,它是一个只能在 defer 中发挥作用的函数,在其他作用域中调用不会发挥作用;

    所以,如果按照楼主的意思,可以了解一下 Defer+Panic+Recover 这一套组合,看能不能满足需求。
    scnace
        7
    scnace  
       2021-02-07 01:41:48 +08:00 via Android
    这要看是单纯 func 还是 method 了,func 的话只能 panic 了(但是不推荐 换我的话可能会再 wrap 一次返回 error
    neoblackcap
        8
    neoblackcap  
       2021-02-07 01:44:49 +08:00
    虽然 panic 是可以做到,但是这不是应该通用化的做法。
    最好还是有错就返回 error,如果有可能的话,请改这个函数接口
    baiyi
        9
    baiyi  
       2021-02-07 09:10:08 +08:00
    是不想写 `if err != nil` 了吗...可以看看这片博客: https://blog.golang.org/errors-are-values
    lewis89
        10
    lewis89  
       2021-02-07 09:11:00 +08:00
    @Dongxiem #6 那其实就是 try-catch-finally... 结果整半天 还是回到 try catch finally 这个流程上面来了
    bfdh
        11
    bfdh  
       2021-02-07 09:45:22 +08:00
    难道不先定义下什么是 error 吗?
    dongtingyue
        12
    dongtingyue  
       2021-02-07 10:14:21 +08:00
    大哥不要老想用另一种语言的方式来写一种语言好吧。。。
    你咋不说能不能不定义变量类型,变量可以直接用+或者.拼接。
    cloverzrg2
        13
    cloverzrg2  
       2021-02-07 10:32:17 +08:00
    不主动返回 error 是指?
    B 遇到错误继续执行?
    Dongxiem
        14
    Dongxiem  
       2021-02-07 13:31:37 +08:00
    @lewis89 可能高级编程语言的设计大体上都是相通的吧。
    guo4224
        15
    guo4224  
       2021-02-07 19:42:19 +08:00
    errno??
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2646 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 12:04 PVG 20:04 LAX 04:04 JFK 07:04
    Do have faith in what you're doing.
    ubao msn 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