一、error与panic:
- error:可预见的错误
- panic:不可预见的错误,panic一般通过defer中的recover()捕获
对于有风险的代码,若发生panic则会导致程序异常退出,例如数组越界。
1. panic的操守
- panic是有秩序的,退出之前会执行完先处理完当前goroutine已经defer【挂上去】的任务,若某个defer在panic之后,则不会被执行。
- panic仅保证当前goroutine下的defer都会被调到,但不保证其他协程的defer也会调到
- 同一goroutine下的已经挂上去的多个defer,回溯执行,即先进后出
例如:
func main() {
defer fmt.Println("defer main")
var user = os.Getenv("USER_")
go func() {
defer fmt.Println("defer caller")
func() {
defer func() {
fmt.Println("defer here")
}()
if user == "" {
panic("should set user env.")
}
}()
}()
time.Sleep(1 * time.Second)
fmt.Printf("get result")
}
//result:
defer here
defer caller
panic: should set user env.
<