解决一般谬误 参考文章https://www.runoob.com/go/go-...
参考1: http://www.topgoer.com/函数/...
参考2: https://zhuanlan.zhihu.com/p/...

Golang 没有结构化异样,应用 panic 抛出谬误,recover 捕捉谬误。

异样的应用场景简略形容:Go中能够抛出一个panic的异样,而后在defer中通过recover捕捉这个异样,而后失常解决。

package mainimport (    "fmt")// 举例除数为0func main() {    var a1 int = 2    var b1 int = 0    // 犹豫除数为0 报错终止    res1 := divisionIntRecover(a1, b1)    fmt.Println("res1",res1)    // 上面的语句无奈失常运行    var a2 int = 2    var b2 int = 2    res2 := divisionIntRecover(a2, b2)    fmt.Println("res2",res2)}//import "fmt"func divisionIntRecover(a int, b int) (ret int) {// 先正文掉 defer 过程终止抛出异样    //defer func() {    //    if err := recover(); err != nil {    //        // 打印异样,敞开资源,退出此函数    //        fmt.Println(err)    //        ret = -3    //    }    //}()    return a / b}

后果

$ go run test.gopanic: runtime error: integer divide by zero #谬误goroutine 1 [running]:main.divisionIntRecover(...)        D:/web/golang/test.go:30 #谬误具体行数main.main()        D:/web/golang/test.go:10 +0x12exit status 2

这样的终止会导致服务进行,咱们上面引入在defer中通过recover捕捉异样

package mainimport (    "fmt")// 举例除数为0func main() {    var a1 int = 2    var b1 int = 0    // 严重错误,解决为-3    res1 := divisionIntRecover(a1, b1)    fmt.Println("res1",res1)    // 持续运行    var a2 int = 2    var b2 int = 2    res2 := divisionIntRecover(a2, b2)    fmt.Println("res2",res2)}//import "fmt"func divisionIntRecover(a int, b int) (ret int) {// 关上正文,如果呈现严重错误 失常解决 返回-3    defer func() {        if err := recover(); err != nil {            // 打印异样,敞开资源,退出此函数            fmt.Println(err)            ret = -3        }    }()    return a / b}

后果

$ go run test.goruntime error: integer divide by zerores1 -3res2 1

咱们举例是 “除数为0”
比方还有其余状况

  1. 空指针援用
  2. 下标越界
  3. 除数为0
  4. 不应该呈现的分支,比方default
  5. 输出不应该引起函数谬误