• 江山如画
    2018-10-08
    一个函数如果要把 panic 转化为error类型值,并将其结果返回给调用方,可以考虑把 defer 语句封装到一个匿名函数之中,下面是实验的一个例子,所用函数是一个除法函数,当除数为0的时候会抛出 panic并捕获。

    func divide(a, b int) (res int, err error) {
        func() {
            defer func() {
                if rec := recover(); rec != nil {
                    err = fmt.Errorf("%s", rec)
                }
            }()
            res = a / b
        }()
        return
    }

    func main() {
        res, err := divide(1, 0)
        fmt.Println(res, err) // 0 runtime error: integer divide by zero

        res, err = divide(2, 1)
        fmt.Println(res, err) // 2 <nil>
    }
    展开
    
     9
  • Bang
    2018-09-28
    先使用go中的类似try catch这样的语句,将异常捕获的异常转为相应的错误error就可以了
    
     8
  • 唐丹
    2018-09-28
    郝大,你好,我在golang 8中通过recover处理panic时发现,必须在引发panic的当前协程就处理掉,否则待其传递到父协程直至main方法中,都不能通过recover成功处理掉了,程序会因此结束。请问这样设计的原因是什么?那么协程是通过panic中记录的协程id来区分是不是在当前协程引发的panic的吗?另外,这样的话,我们应用程序中每一个通过go新起的协程都应该在开始的地方recover,否则即使父协程有recover也不能阻止程序因为一个意外的panic而挂掉?盼望解答,谢谢🙏

    作者回复: 只要在调用栈路径上就都可以处理,如果你用了defer语句和recover函数等正确处理方式还是不行的话,就要看看这个panic是不是不了恢复的。一些runtime抛出来的panic是不可恢复的,因为问题很严重必须整改代码才行。

    
     5
  • 冰激凌的眼泪
    2018-10-02
    panic时,会捕获异常及异常上下文(函数名+文件行)
    类似看作有一个异常上下文列表,始于异常触发处,沿着函数调用逆向展开,每一级append自己的异常上下文,直至goroutine入口函数,最终被runtime捕获
    最终异常信息被打印,异常上下文列表被顺序打印,程序退出
    
     2
  • 🤔
    2019-03-03
    https://gist.github.com/bwangelme/9ce1c606ba9f69c72f82722adf1402e1
    
     1
  • A 凡
    2018-10-24
    之前自己学习时候的一些模糊点更加清晰了,支持!
    
     1
  • 虢國技醬
    2019-01-21
    打卡
    
    
  • melody_future
    2018-12-25
    panic、recover 有点像try、、catch。这样应该会好理解很多
    
    
我们在线,来聊聊吧