学习笔记,写到哪是哪。
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中获取了异常,继续恢复了执行。
小结后面得看看并发处理了。



