134 lines
1.9 KiB
Go
134 lines
1.9 KiB
Go
/*
|
|
* @Author : huangzj
|
|
* @Time : 2020/7/13 14:37
|
|
* @Description:测试defer关键字、recover
|
|
*/
|
|
|
|
package originGoLanguage
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
func TestDefer() {
|
|
//defer会在所有函数执行完成之后才进行执行
|
|
testDeferExe()
|
|
//defer产生的值是在对应位置的值,后面的变化不会产生影响
|
|
fmt.Println(testDeferValue())
|
|
//defer的执行是先进后出
|
|
testDeferExeOrder()
|
|
testDeferRecover() //defer对异常的捕获
|
|
testDeferRecoverOut() //外层异常捕获
|
|
}
|
|
|
|
func TestCtripException() {
|
|
fmt.Println("测试不进行捕获的情况")
|
|
testNotDefer()
|
|
|
|
fmt.Println("测试进行捕获的情况")
|
|
testDefer1()
|
|
}
|
|
|
|
func testNotDefer() {
|
|
go sayHello()
|
|
|
|
for i := 0; i < 10; i++ {
|
|
time.Sleep(5000)
|
|
fmt.Println(i)
|
|
}
|
|
}
|
|
|
|
func testDefer1() {
|
|
go sayHello1()
|
|
|
|
for i := 0; i < 10; i++ {
|
|
time.Sleep(5000)
|
|
fmt.Println(i)
|
|
}
|
|
}
|
|
|
|
func sayHello1() {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
fmt.Println("错误信息", err)
|
|
}
|
|
}()
|
|
}
|
|
|
|
func sayHello() {
|
|
var map1 map[string]int
|
|
//这里会发生异常
|
|
fmt.Println(map1["say"])
|
|
}
|
|
|
|
func testDeferRecover() {
|
|
//多个panic只会捕获最后一个
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
fmt.Println("错误信息是:", err)
|
|
}
|
|
}()
|
|
|
|
panic1()
|
|
panic2()
|
|
panic3()
|
|
|
|
//一旦错误被捕获就不会继续运行
|
|
fmt.Println("我会继续运行")
|
|
|
|
}
|
|
|
|
func panic3() {
|
|
panic("panic3")
|
|
}
|
|
|
|
func panic2() {
|
|
panic("panic2")
|
|
}
|
|
|
|
func panic1() {
|
|
panic("panic1")
|
|
}
|
|
|
|
func testDeferRecoverOut() {
|
|
testDeferRecover()
|
|
|
|
fmt.Println("外层继续执行")
|
|
}
|
|
|
|
func testDeferExe() {
|
|
i := 0
|
|
defer func() {
|
|
fmt.Println(i)
|
|
}()
|
|
fmt.Println("i am after")
|
|
}
|
|
|
|
func testDeferValue() int {
|
|
i := 0
|
|
defer func() {
|
|
fmt.Println("first: ", i)
|
|
}()
|
|
|
|
i++
|
|
defer func() {
|
|
fmt.Println("second: ", i)
|
|
}()
|
|
|
|
i++
|
|
return i
|
|
}
|
|
|
|
func testDeferExeOrder() {
|
|
defer func() {
|
|
fmt.Println("first")
|
|
}()
|
|
|
|
defer func() {
|
|
fmt.Println("second")
|
|
}()
|
|
|
|
defer fmt.Println("third")
|
|
}
|