Panic和Recover

panicrecoverpanic

Panic

FpanicFFFFpanicpanicgoroutinepanic

Recover

goroutinerecoverrecovernilgoroutinerecoverpanic
panic
var user = os.Getenv("USER")  
    func init() {     
    if user == "" {         
    panic("no value for $USER")     
      } 
    }
panic
func throwsPanic(f func()) (b bool) {
	defer func() {
		if x := recover(); x != nil {
			b = true
		}
	}()
	f() //执行函数f,如果f中出现了panic,那么就可以恢复回来
	return
}

最容易理解就是给个例子,文章里有例子:

package main

import (
    "fmt"
    //"os"
)

var user = ""

func inita() {
    defer func() {
        fmt.Print("defer##\n")
    }()
    if user == "" {
        fmt.Print("@@@before panic\n")
        panic("no value for user\n")
        fmt.Print("!!after panic\n")
    }
}

func throwsPanic(f func()) (b bool) {
    defer func() {
        if x := recover(); x != nil {
            fmt.Print(x)
            b = true
        }
    }()

    f()
    fmt.Print("after the func run")
    return
}
func main() {
    throwsPanic(inita)
}

执行结果:

D:\go>go run b.go
@@@before panic
defer##
no value for user

如上面所说的:

panicuser=""fmt.Print("!!after panic\n")defer##
deferRecoverpanicno value for user