亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang使用panic控制程序錯誤流程

 更新時間:2023年04月22日 10:26:28   作者:米花町的小偵探  
這篇文章主要介紹了Golang使用panic控制程序錯誤流程,Golang panic異常處理機制中的一種流程控制方式,用于中斷程序流程并觸發(fā)異常處理

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é)果如下,我們看到當(dāng)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停止當(dāng)前Go程的正常執(zhí)行。當(dāng)函數(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)文章

  • Go語言sync.Map實現(xiàn)高并發(fā)場景下的安全映射

    Go語言sync.Map實現(xiàn)高并發(fā)場景下的安全映射

    當(dāng)我們面對高并發(fā)場景時,使用普通的map類型會遇到棘手的并發(fā)安全問題,下面就來介紹一下Go語言sync.Map實現(xiàn)高并發(fā)場景下的安全映射,具有一定的參考價值,感興趣的可以了解一下
    2025-05-05
  • 詳解Go?中的時間處理

    詳解Go?中的時間處理

    這篇文章主要介紹了Go?中的時間處理,本文將介紹?time?庫中一些重要的函數(shù)和方法,希望能幫助到那些一遇到?Go?時間處理問題就需要百度的童鞋,需要的朋友可以參考下
    2022-07-07
  • Golang獲取當(dāng)前時間代碼

    Golang獲取當(dāng)前時間代碼

    本文給大家匯總介紹了golang中的相關(guān)的時間的操作,有需要的小伙伴可以拿走參考下
    2018-10-10
  • 使用Golang實現(xiàn)Sm2加解密的代碼詳解

    使用Golang實現(xiàn)Sm2加解密的代碼詳解

    本文主要介紹了Go語言實現(xiàn)Sm2加解密的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Golang使用ReverseProxy實現(xiàn)反向代理的方法

    Golang使用ReverseProxy實現(xiàn)反向代理的方法

    本文介紹了如何使用Golang的ReverseProxy實現(xiàn)反向代理,包括源碼結(jié)構(gòu)解析和官方單機示例NewSingleHostReverseProxy,同時指出,若要實現(xiàn)負載均衡,需要自行開發(fā),還提供了一個簡單的HTTP服務(wù)用于測試,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 解決vscode中g(shù)olang插件依賴安裝失敗問題

    解決vscode中g(shù)olang插件依賴安裝失敗問題

    這篇文章主要介紹了解決vscode中g(shù)olang插件依賴安裝失敗問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Go語言中http.ResponseWriter接口

    Go語言中http.ResponseWriter接口

    http.ResponseWriter是Go語言中用來設(shè)置HTTP響應(yīng)的接口,本文主要介紹了Go語言中http.ResponseWriter接口,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Golang全局變量加鎖的問題解決

    Golang全局變量加鎖的問題解決

    這篇文章主要介紹了解決Golang全局變量加鎖的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang中下劃線(_)的不錯用法分享

    Golang中下劃線(_)的不錯用法分享

    golang中的下劃線表示忽略變量的意思,也沒有產(chǎn)生新的變量,但是后面的表達式依然會被執(zhí)行,本文為大家整理了golang中下劃線的一些不錯的用法,需要的可以參考下
    2023-05-05
  • Go?gRPC服務(wù)端流式RPC教程示例

    Go?gRPC服務(wù)端流式RPC教程示例

    這篇文章主要為大家介紹了Go?gRPC服務(wù)端流式RPC教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論