学习笔记,写到哪是哪。
Go语言中的程序终止,可以使用panic关键字主动终止。和error不同,是导致程序无法继续执行的中止。
1、配合defer使用
配合panic中止后,defer后的语句也会继续执行。
样例代码如下
package main import ( "fmt" ) func test_panic1() { defer fmt.Println("宕机执行内容1") defer fmt.Println("宕机执行内容2") panic("异常终止") } func main() { test_panic1() }
执行结果如下
宕机执行内容2
宕机执行内容1
panic: 异常终止
goroutine 1 [running]:
main.test_panic1()
D:/goProject/demo/test_panic_recover.go:19 +0xac
main.main()
D:/goProject/demo/test_panic_recover.go:43 +0x17
可以看出,defer语句执行在panic之前。
2、recover的使用
recover可以让宕机恢复过来,但是只能在defer语句中使用,这个很好理解。有点像try/catch的机制,异常捕获,不影响主流程的继续执行。
样例代码如下
package main import ( "fmt" "runtime" ) func protectFunc(input func()) { defer func() { err := recover() switch err.(type) { case runtime.Error: fmt.Println("runtime error", err) default: fmt.Println("error", err) } }() input() } func test_func_1() { fmt.Println("start") var a *int *a = 1 fmt.Println("end", *a) } func main() { protectFunc(test_func_1) fmt.Println("go on") }
执行结果如下
start
runtime error runtime error: invalid memory address or nil pointer dereference
go on
可以看出,从recover中获取了异常,继续恢复了执行。
小结
后面得看看并发处理了。