成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文掌握Golang中Panic與Recover的作用和使用方法

開發 前端
本文介紹了Panic和Recover的作用及使用方法,以及Defer/Panic/Recover配合使用實現類似Try/Catch的功能。

panic

panic作用是終止當前正在運行的程序(包括所有協程)并輸出導致異常的堆棧信息。在遇到無法處理的異常情況時,例如比如數組越界、操作未初始化的map、空指針等都會觸發panic。主動觸發panic示例:

package main   
  
func main() {  
    // 未處理的自定義異常  
    customException := "an error occurred"   
    panic(customException)  
}

會輸出如下信息:

panic: an error occurred

goroutine 1 [running]:
main.main()
        /Users/ning/projects/go/workspace/hello/panic/main.go:7 +0x34

Process finished with the exit code 2

數據越界導致panic示例:

package main

import "fmt"

func main() {
	a := [2]int{4, 5}
	fmt.Println(a[3])
}

會輸出如下信息:

# command-line-arguments
./main.go:11:16: invalid argument: array index 3 out of bounds [0:2]

Compilation finished with exit code 2

recover

recover可以讓觸發了panic的程序繼續運行,recover僅在延遲函數defer中有效,在正常的執行過程中,調用recover會返回nil并且不產生其他任何效果。如果當前的goroutine觸發了panic,調用recover可以捕獲到panic的輸入值,并且恢復正常運行。這個特性對于像web服務就非常有用了, 當web服務處理某個請求時,某個方法觸發了panic,這時候顯然是不應該直接讓web服務掛掉的。這種場景下,就可以使用recover來捕獲panic并且讓服務正常運行下去。

在其他語言里,通常是底層拋出異常,上層邏輯通過try/catch捕獲異常。defer/panic/recover配合使用可以實現類似try/catch的功能。

將Recover()寫在defer中,在可能發生panic的代碼之前執行defer,當程序觸發panic后,系統將跳過后面的代碼,按照逆序執行已經注冊的defer函數,如果defer函數中調用了recover(),recover()會返回捕獲到的panic的錯誤信息。

使用recover需要注意幾點:

  • recover需要在defer的方法里面直接調用,不能對recover()包一層方法后再在defer的方法里面調用
  • recover只能捕獲同一個協程中的panic,無法捕獲其它協程的panic

defer/panic/recover示例

成功捕獲實例一

func main() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Printf("recover:%v\n", err)
		}
	}()
	panic("an error occurred")
}

成功捕獲實例二

func main() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Printf("recover:%v\n", err)
		}
	}()
	test()
}

func test() {
	panic("an error occurred")
}

成功捕獲實例三

func main() {
	test()
}

func test() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Printf("recover:%v\n", err)
		}
	}()
	panic("an error occurred")
}

不能捕獲實例一

func main() {
	if err := recover(); err != nil {
		fmt.Printf("recover:%v\n", err)
	}
	panic("an error occurred")
}

不能捕獲實例二

func main() {
	go func() {
		defer func() {
			if err := recover(); err != nil {
				fmt.Printf("recover:%v\n", err)
			}
		}()
	}()
	panic("an error occurred")
}

不能捕獲實例三

func main() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Printf("recover:%v\n", err)
		}
	}()

	go test()

	for {
		select {}
	}
}

func test() {
	panic("an error occurred")
}

不能捕獲實例四

func main() {
	defer func() {
		recoverFromPanic()
	}()

	test()
}

func recoverFromPanic() {
	if err := recover(); err != nil {
		fmt.Printf("recover:%v\n", err)
	}
}

func test() {
	panic("an error occurred")
}

不能捕獲實例五

func main() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Printf("recover:%v\n", err)
		}
	}()

	test()

	for {
		select {}
	}
}

func test() {
	go func() {
		panic("an error occurred")
	}()
}

小結

本文介紹了panic和recover的作用及使用方法,以及defer/panic/recover配合使用實現類似try/catch的功能,下篇文章將從源碼角度來做講解。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-08-01 09:27:44

Golang模糊測試

2023-03-03 13:43:00

Java字節流

2023-07-04 08:56:07

指針類型Golang

2023-10-09 07:14:42

panicGo語言

2024-02-23 19:11:13

C++編程開發

2022-06-09 08:17:30

Python__new__

2024-11-19 09:00:00

Pythondatetime模塊

2024-12-17 17:20:00

Python列表

2022-10-21 17:24:34

契約測試定位

2022-12-20 07:39:46

2023-12-21 17:11:21

Containerd管理工具命令行

2010-07-05 09:38:47

LinuxNFS

2021-09-09 17:05:36

C++智能指針語言

2024-10-10 09:12:10

Spring接口初始化

2021-06-06 13:06:34

JVM內存分布

2021-05-12 18:22:36

Linux 內存管理

2025-04-18 05:50:59

Spring接口Aware

2023-11-30 07:15:36

GolangRecover

2024-11-27 06:46:47

Python列表推導式嵌套邏輯

2024-04-28 08:14:29

C#隊列Queue
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.夜夜草| 成人免费观看视频 | 日本精品一区二区三区视频 | 亚洲一区二区精品 | 无码国模国产在线观看 | 欧美亚洲视频在线观看 | 午夜理伦三级理论三级在线观看 | 国产精品精品视频一区二区三区 | 国产成人综合在线 | 国产成人精品a视频一区www | 亚洲国产成人精 | 国产成人av一区二区三区 | 在线日韩欧美 | 美女久久 | 蜜桃av一区二区三区 | 国产xxxx岁13xxxxhd| 亚洲欧美国产精品一区二区 | av日韩一区 | 小早川怜子xxxxaⅴ在线 | 欧美日韩在线成人 | 夜夜爽99久久国产综合精品女不卡 | 国产精品v| 91免费看片| 亚洲最大看片网站 | 毛片一级电影 | 精品久久久久久久久久久久久久久久久 | 久草新在线 | 一区二区三区视频免费观看 | 午夜精品一区二区三区在线视 | 黄色网址在线免费观看 | 欧美日韩亚洲国产综合 | 国产一级片在线观看视频 | 亚洲精品一区二区在线观看 | 天天躁日日躁狠狠躁2018小说 | 久久久久久久久久久久91 | 奇米av| 日韩视频一区二区 | 激情网五月天 | 伊人伊人 | 一级欧美一级日韩片免费观看 | 一区二区三区四区国产 |