欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1.panic是什么

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

2.panic有什么用

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

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

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

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

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

2.我們?cè)囋囂砑觩anic函數(shù)

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

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

yantao@hasee:~/go/src/panic_learn$ go run main.go 
main開始
panic: 這是一個(gè)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("這是一個(gè)panic")
	fmt.Println("main結(jié)束")
}
func fun1()  {
	fmt.Println("fun1開始")
	panic("這是一個(gè)fun1的panic") //第17行
	fmt.Println("fun1結(jié)束")
}

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

yantao@hasee:~/go/src/panic_learn$ go run main.go 
main開始
fun1開始
panic: 這是一個(gè)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停止當(dāng)前Go程的正常執(zhí)行。當(dāng)函數(shù)fun1調(diào)用panic時(shí),fun1的正常執(zhí)行就會(huì)立刻停止。fun1返回給其調(diào)用者G。G如同fun1一樣行動(dòng),層層返回,直到主函數(shù)main。然后程序被終止,然后打印該恐慌的實(shí)參值(“這是一個(gè)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

但是我們不想因?yàn)閐iv的錯(cuò)誤讓main停止,讓第12行也能繼續(xù)運(yùn)行。這就引出了 defer…recover

3.defer…recover

defer…recover用來捕獲錯(cuò)誤,defer 后面跟上匿名函數(shù)的調(diào)用,程序不會(huì)因?yàn)閜anic而中斷。

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確實(shí)存在
			fmt.Println("捕獲到錯(cuò)誤啦,錯(cuò)誤是:",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開始
捕獲到錯(cuò)誤啦,錯(cuò)誤是: runtime error: integer divide by zero
main結(jié)束

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

相關(guān)文章

  • Go歸并排序算法的實(shí)現(xiàn)方法

    Go歸并排序算法的實(shí)現(xiàn)方法

    歸并排序采用的也是分治的策略,把原本的問題先分解成一些小問題進(jìn)行求解,再把這些小問題各自的答案修整到一起得到原本問題的答案,從而達(dá)到分而治之的目的,對(duì)Go歸并排序算法相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-04-04
  • go?defer?return?panic?執(zhí)行順序示例詳解

    go?defer?return?panic?執(zhí)行順序示例詳解

    這篇文章主要介紹了go?defer?return?panic?執(zhí)行順序,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • go?smtp實(shí)現(xiàn)郵件發(fā)送示例詳解

    go?smtp實(shí)現(xiàn)郵件發(fā)送示例詳解

    這篇文章主要為大家介紹了go?smtp實(shí)現(xiàn)郵件發(fā)送示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Go打包二進(jìn)制文件的實(shí)現(xiàn)

    Go打包二進(jìn)制文件的實(shí)現(xiàn)

    這篇文章主要介紹了Go打包二進(jìn)制文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Golang中的同步工具sync.Map示例詳解

    Golang中的同步工具sync.Map示例詳解

    sync.Map是Golang標(biāo)準(zhǔn)庫(kù)提供的并發(fā)安全的Map類型,可以在多個(gè)goroutine并發(fā)讀寫Map的場(chǎng)景下不需要加鎖,這篇文章主要介紹了Golang中的同步工具sync.Map詳解,需要的朋友可以參考下
    2023-05-05
  • Golang中HTTP服務(wù)的分析與設(shè)計(jì)詳解

    Golang中HTTP服務(wù)的分析與設(shè)計(jì)詳解

    這篇文章主要介紹了Golang中HTTP服務(wù)的分析與設(shè)計(jì),HTTP服務(wù)是實(shí)現(xiàn)Web應(yīng)用程序的重要組成部分,為了實(shí)現(xiàn)高效可擴(kuò)展的Web應(yīng)用程序,需要對(duì)HTTP服務(wù)進(jìn)行分析與設(shè)計(jì),需要的朋友可以參考下
    2023-05-05
  • golang 函數(shù)以及函數(shù)和方法的詳解及區(qū)別

    golang 函數(shù)以及函數(shù)和方法的詳解及區(qū)別

    這篇文章主要介紹了golang 函數(shù)以及函數(shù)和方法的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Go語(yǔ)言中io包核心接口示例詳解

    Go語(yǔ)言中io包核心接口示例詳解

    Go的io包提供了io.Reader和io.Writer接口,分別用于數(shù)據(jù)的輸入和輸出,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中io包核心接口的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • Go實(shí)現(xiàn)線程池(工作池)的兩種方式實(shí)例詳解

    Go實(shí)現(xiàn)線程池(工作池)的兩種方式實(shí)例詳解

    這篇文章主要介紹了Go實(shí)現(xiàn)線程池(工作池)的兩種方式實(shí)例詳解,需要的朋友可以參考下
    2022-04-04
  • golang 實(shí)現(xiàn)json類型不確定時(shí)的轉(zhuǎn)換

    golang 實(shí)現(xiàn)json類型不確定時(shí)的轉(zhuǎn)換

    這篇文章主要介紹了golang 實(shí)現(xiàn)json類型不確定時(shí)的轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評(píng)論