最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang中的panic之避免和處理程序中的異常情況

 更新時間:2023年04月18日 10:43:18   作者:米花町的小偵探  
Golang中的panic是一種異常處理機制,可以在程序出現(xiàn)異常情況時終止程序并打印錯誤信息。為了避免panic對程序的影響,開發(fā)者可以采用一系列技巧,如defer+recover、編寫可重入的代碼、使用錯誤返回值等。這些技巧可以幫助開發(fā)者優(yōu)雅地處理程序中的異常情況

1.panic是什么

panic() 是一個內(nèi)建的函數(shù)

2.panic有什么用

作用:可以使用panic停止程序繼續(xù)運行,所以大多數(shù)都是在demo中使用,項目中盡量少使用,畢竟我們不能讓我們的項目突然退出了。

1.首先我們來看下面的這段代碼

package main
import "fmt"
func main() {
	fmt.Println("main開始")
	fmt.Println("main結(jié)束")
}

這是一段非常簡單的代碼,運行結(jié)果如下,我們可以看到整個程序正常的運行然后結(jié)束了。

yantao@hasee:~/go/src/panic_learn$ go run main.go 
main開始
main結(jié)束

2.我們試試添加panic函數(shù)

package main
import "fmt"
func main() {
   fmt.Println("main開始")
   panic("這是一個panic")	//第8行
   fmt.Println("main結(jié)束")
}

結(jié)果如下,我們看到當panic函數(shù)運行之后,后面的代碼就不在執(zhí)行了,主程序main退出。

yantao@hasee:~/go/src/panic_learn$ go run main.go 
main開始
panic: 這是一個panic

goroutine 1 [running]:
main.main()
        /home/yantao/go/src/panic_learn/main.go:8 +0x65
exit status 2

3.如果panic出現(xiàn)在被調(diào)用者內(nèi)呢

package main
import "fmt"
func main() {
	fmt.Println("main開始")
	fun1()
	panic("這是一個panic")
	fmt.Println("main結(jié)束")
}
func fun1()  {
	fmt.Println("fun1開始")
	panic("這是一個fun1的panic") //第17行
	fmt.Println("fun1結(jié)束")
}

我們發(fā)現(xiàn)程序在17行運行之后,fun1停止向下繼續(xù)運行了,而且調(diào)用者main也停止在調(diào)用fun1的地方了,并且退出了主程序main函數(shù)。

yantao@hasee:~/go/src/panic_learn$ go run main.go 
main開始
fun1開始
panic: 這是一個fun1的panic

goroutine 1 [running]:
main.fun1()
        /home/yantao/go/src/panic_learn/main.go:17 +0x65
main.main()
        /home/yantao/go/src/panic_learn/main.go:7 +0x57
exit status 2

內(nèi)建函數(shù)panic停止當前Go程的正常執(zhí)行。當函數(shù)fun1調(diào)用panic時,fun1的正常執(zhí)行就會立刻停止。fun1返回給其調(diào)用者G。G如同fun1一樣行動,層層返回,直到主函數(shù)main。然后程序被終止,然后打印該恐慌的實參值(“這是一個fun1的panic”)。

下面的代碼也出現(xiàn)了panic

package main
import (
	"fmt"
)
func main() {
	fmt.Println("main開始")
	div()
	fmt.Println("main結(jié)束") //第17行
}
func div()  {
	var a = 5
	var b = 0
	res := a /b
	fmt.Println(res)
}

由于panic,程序停止了

yantao@hasee:~/go/src/panic_learn$ go run main.go 
main開始
panic: runtime error: integer divide by zero

goroutine 1 [running]:
main.div()
        /home/yantao/go/src/panic_learn/main.go:19 +0x11
main.main()
        /home/yantao/go/src/panic_learn/main.go:10 +0x5b
exit status 2

但是我們不想因為div的錯誤讓main停止,讓第12行也能繼續(xù)運行。這就引出了 defer…recover

3.defer…recover

defer…recover用來捕獲錯誤,defer 后面跟上匿名函數(shù)的調(diào)用,程序不會因為panic而中斷。

package main
import (
	"fmt"
)
func main() {
	fmt.Println("main開始")
	div()
	fmt.Println("main結(jié)束") //第12行
}
func div()  {
	defer func() {
		err := recover()
		if err != nil {
			//err確實存在
			fmt.Println("捕獲到錯誤啦,錯誤是:",err)
		}
	}()
	var a = 5
	var b = 0
	res := a /b
	fmt.Println(res)
}

我們看到main函數(shù)能夠繼續(xù)執(zhí)行了,沒有被中斷。

yantao@hasee:~/go/src/panic_learn$ go run main.go 
main開始
捕獲到錯誤啦,錯誤是: runtime error: integer divide by zero
main結(jié)束

到此這篇關(guān)于Golang中的panic之避免和處理程序中的異常情況的文章就介紹到這了,更多相關(guān)Golang panic內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang網(wǎng)絡(luò)通信超時設(shè)置方式

    golang網(wǎng)絡(luò)通信超時設(shè)置方式

    這篇文章主要介紹了golang網(wǎng)絡(luò)通信超時設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang實現(xiàn)單元測試中的邏輯層

    Golang實現(xiàn)單元測試中的邏輯層

    前面我們完成了最麻煩的數(shù)據(jù)層的單元測試,今天我們來看看單元測試中最容易做的一層,數(shù)據(jù)邏輯層,也就是我們通常說的 service 或者 biz 等
    2023-03-03
  • go NewTicker的用法示例代碼

    go NewTicker的用法示例代碼

    在 Go 語言中,time.NewTicker函數(shù)用于創(chuàng)建一個周期性觸發(fā)的定時器,這篇文章主要介紹了go NewTicker的使用,需要的朋友可以參考下
    2023-07-07
  • goland 設(shè)置project gopath的操作

    goland 設(shè)置project gopath的操作

    這篇文章主要介紹了goland 設(shè)置project gopath的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言與gRPC的完美結(jié)合實戰(zhàn)演練

    Go語言與gRPC的完美結(jié)合實戰(zhàn)演練

    這篇文章主要介紹了Go語言與gRPC的完美結(jié)合實戰(zhàn)演練,gRPC(Remote?Procedure?Call)是一種遠程過程調(diào)用技術(shù),通過壓縮和序列化數(shù)據(jù)來優(yōu)化網(wǎng)絡(luò)通信,可以顯著提高服務(wù)調(diào)用的性能和效率
    2024-01-01
  • 一篇文章學會GO語言中的變量

    一篇文章學會GO語言中的變量

    Go語言是靜態(tài)類型語言,因此變量有明確類型的,編譯器也會檢查變量類型的正確性,下面這篇文章主要給大家介紹了關(guān)于GO語言中變量的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • Golang 實現(xiàn)復制文件夾同時復制文件

    Golang 實現(xiàn)復制文件夾同時復制文件

    這篇文章主要介紹了Golang 實現(xiàn)復制文件夾同時復制文件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • GoLang channel底層代碼實現(xiàn)詳解

    GoLang channel底層代碼實現(xiàn)詳解

    Channel和goroutine的結(jié)合是Go并發(fā)編程的大殺器。而Channel的實際應用也經(jīng)常讓人眼前一亮,通過與select,cancel,timer等結(jié)合,它能實現(xiàn)各種各樣的功能。接下來,我們就要梳理一下GoLang channel底層代碼實現(xiàn)
    2022-10-10
  • GO的基礎(chǔ)知識掃盲注意事項

    GO的基礎(chǔ)知識掃盲注意事項

    這篇文章主要介紹了GO的基礎(chǔ)知識注意事項,本文是GO語言小白的掃盲文,主要講解了go語言的基本知識,GO程序目錄結(jié)構(gòu),GO程序包的導入與別名運用,GO內(nèi)置關(guān)鍵字,GO注釋方法需要的朋友可以參考下
    2022-12-12
  • GoLand 2020.3 正式發(fā)布有不少新功能(支持泛型)

    GoLand 2020.3 正式發(fā)布有不少新功能(支持泛型)

    這是 2020 年第 3 個版本,也是最后一個版本,你還將發(fā)現(xiàn)許多新的代碼編輯功能,具體內(nèi)容詳情跟隨小編看看有哪些新特性
    2020-12-12

最新評論

忻城县| 海宁市| 天峨县| 翁牛特旗| 布拖县| 曲沃县| 平潭县| 吐鲁番市| 滕州市| 布拖县| 云阳县| 霍州市| 泗水县| 上栗县| 苏州市| 莆田市| 讷河市| 鹤岗市| 富裕县| 长白| 广汉市| 兴安县| 鹤岗市| 裕民县| 安化县| 逊克县| 吕梁市| 兴宁市| 徐州市| 静乐县| 隆昌县| 广州市| 太保市| 东源县| 台安县| 宜章县| 类乌齐县| 通州区| 乌拉特前旗| 邹平县| 宁河县|