go语言中的panic和recover
- panic类似于其他编程语言中的throw或者raise,用于抛出异常;
- 当执行到panic后终止执行剩余代码,并打印错误堆栈信息;
- panic并不是像os.Exit(0)一样立即停止程序的运行,panic如果有defer还是会被执行的;
- recover用于处理panic,一是返回panic的信息,二是恢复panic的状态;
- recover只能恢复当前函数级别或者当前函数调用中的panic,恢复后调用当前级别函数结束,但是调用此函数的函数可以继续执行;
- panic会一直向上传递,如果没有recover()则表示程序终止,如果遇到了recover(),那么recover()所在级别函数在外界看来是没有出现panic的,这时候panic就不会继续向上传递;(类似于JavaScript的事件冒泡)
package main
import "fmt"
func main() {
fmt.Println("测试开始")
testRecover1()
fmt.Println("测试结束")
}
func testPanic1() {
fmt.Println("1")
fmt.Println("2")
panic("您的电脑太垃圾了,无法继续执行,不信你看下面一行就不会执行!")
fmt.Println("3")
}
func testPanic2() {
defer func() {
fmt.Println("defer中的内容")
}()
fmt.Println("1")
fmt.Println("2")
panic("您的电脑太垃圾了,无法继续执行,不信你看下面一行就不会执行!")
fmt.Println("3")
}
func testRecover1(){
fmt.Println("testRecover1上半部分")
testRecover2()
fmt.Println("testRecover1下半部分")
}
func testRecover2(){
defer func() {
fmt.Println("在testRecover2()中进行了恢复recover()")
recover()
}()
fmt.Println("testRecover2上半部分")
testRecover3()
fmt.Println("testRecover2下半部分")
}
func testRecover3(){
fmt.Println("testRecover3上半部分")
testRecover4()
fmt.Println("testRecover3下半部分")
}
func testRecover4(){
fmt.Println("testRecover4上半部分")
panic("在testRecover4()中出现了panic")
fmt.Println("testRecover4下半部分")
}