golang没有类似C中的try catch finlly,但是提供了defer revover panic
defer“延迟” 函数调用返回之前按照先进先出的顺序进行调用defer中的函数。
使用规则:1.defer函数中的参数值再定义时即进行计算。
func a() {
i := 0
defer fmt.Println(i)
i++
return
}
先进后出原则
func b() {
for i := 0; i < 4; i++ {
defer fmt.Print(i)
}
}
可以读取并设置返回值
func c() (i int) {
defer func() { i++ }()
return 1
}
panic "恐慌"函数执行时,意味着函数进入恐慌模式,抛出异常。如果函数有panic函数执行,则想上一层调用者返回panci信息,上一层也按照此逻辑执行,如果goroutine没有处理panic信息,则goroute会异常崩溃,如果是主goroute,则程序崩溃。
recover“恢复”用于处理panic抛出的异常信息
package main
import "fmt"
func main() {
f()
fmt.Println("Returned normally from f.")
}
func f() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
fmt.Println("Calling g.")
g(0)
fmt.Println("Returned normally from g.")
}
func g(i int) {
if i > 3 {
fmt.Println("Panicking!")
panic(fmt.Sprintf("%v", i))
}
defer fmt.Println("Defer in g", i)
fmt.Println("Printing in g", i)
g(i + 1)
}
其输出结果为:
Calling g.
Printing in g 0
Printing in g 1
Printing in g 2
Printing in g 3
Panicking!
Defer in g 3
Defer in g 2
Defer in g 1
Defer in g 0
Recovered in f 4
Returned normally from f.