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

一文掌握Golang的panic和recover實戰(zhàn)

 更新時間:2024年09月10日 15:48:17   作者:CodeJR  
Go語言中,異常處理通常依賴error返回值,本文將通過示例展示如何在Go語言中正確使用recover來處理panic異常,防止程序直接崩潰,感興趣的朋友跟隨小編一起看看吧

簡述

我們都知道在Go語言中的異常處理是通過方法返回error,然后在調用方法處接收error并處理,這里的error通常是使用在業(yè)務異常的處理。

如果程序發(fā)生數(shù)組越界、空指針等異常就不會再通過error來處理,而是通過panic直接報錯并終止程序和打印出堆棧信息。那么如何在程序發(fā)生panic的時候去處理這個異常而不是終止程序呢?這個時候就需要使用到recover,recover可以捕獲到panic異常,并恢復程序的運行。

panic

  • 調用panic后立即終止執(zhí)行當前函數(shù)的剩余代碼,在當前goroutine中執(zhí)行當前函數(shù)所有的defer
  • panic只會觸發(fā)當前goroutine的defer

recover

  • 調用recover可以捕獲panic的異常,并恢復程序的執(zhí)行
  • recover只在defer延遲函數(shù)中調用才會生效

實戰(zhàn)

示例1

我們首先在代碼中直接使用recover捕獲異常,并使用panic手動拋出一個異常,看看程序會怎么樣

func main() {
	test()
	fmt.Println("main")
}
func test() {
	if err := recover(); err != nil {
		fmt.Println("recover: ", err)
	}
	panic("error")
}

運行上面的代碼之后可以從輸出看到在test函數(shù)中發(fā)生了panic,并且直接終止運行,導致main函數(shù)中的打印也沒有生效,這是因為在前面的時候有講到過,recover必須在defer延遲函數(shù)中調用才會生效。

panic: error                                                    
goroutine 1 [running]:                                          
main.test()                                                     
        C:/Users/lee/GolandProjects/test/main.go:33 +0x30
main.main()                                                     
        C:/Users/lee/GolandProjects/test/main.go:24 +0x13

示例2

修改上面的代碼,將recover放到defer延遲函數(shù)中調用:

func main() {
	test()
	fmt.Println("main")
}
func test() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("recover: ", err)
		}
	}()
	panic("error")
}

這個時候我們再次運行代碼,可以看到雖然在test函數(shù)中發(fā)生了panic,但是程序并沒有終止運行,而是被defer中的recover捕獲到了異常并恢復運行,同時main函數(shù)中的print也正常打印。

recover:  error
main

示例3

上面示例2中將recover是放到defer的函數(shù)中調用,那么如果在defer后面直接調用recover會生效嗎?使用下面代碼進行測試。

func main() {
	test()
	fmt.Println("main")
}
func test() {
	defer recover()
	panic("error")
}

運行上面的代碼之后發(fā)現(xiàn)在defer后面直接調用recover是無效的,程序照樣會發(fā)生異常并終止運行,所以**recover必須是在defer的延遲函數(shù)中調用才會生效。**示例2中是匿名延遲函數(shù),如果使用具名延遲函數(shù)同樣有效。

panic: error
goroutine 1 [running]:
main.test()
        C:/Users/lee/GolandProjects/test/main.go:30 +0x58
main.main()
        C:/Users/lee/GolandProjects/test/main.go:24 +0x13

示例4

上面說到過recover必須在defer的延遲函數(shù)中調用,那下面的代碼可以生效嗎?

func main() {
	test()
	fmt.Println("main")
}
func test() {
	defer func() {
		defer recover()
	}()
	panic("error")
}

運行上面的代碼可以看到recover是生效的,recover函數(shù)被一個延遲函數(shù)調用,且recover函數(shù)本身作為一個延遲函數(shù),這個情況下也是可以正常捕獲panic異常的,程序運行如下:

main

到此這篇關于一文掌握Golang的panic和recover的文章就介紹到這了,更多相關Golang panic和recover內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang?Mutex互斥鎖源碼分析

    Golang?Mutex互斥鎖源碼分析

    本篇文章,我們將一起來探究下Golang?Mutex底層是如何實現(xiàn)的,知其然,更要知其所以然。文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-10-10
  • Go語言如何輕松編寫高效可靠的并發(fā)程序

    Go語言如何輕松編寫高效可靠的并發(fā)程序

    這篇文章主要為大家介紹了Go語言輕松編寫高效可靠的并發(fā)程序實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Goland 的安裝及激活教程(window、linux下安裝)

    Goland 的安裝及激活教程(window、linux下安裝)

    這篇文章主要介紹了Golang Goland 的安裝及激活詳細教程,包括window下安裝goland和linux下安裝goland,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Golang解析yaml文件操作指南

    Golang解析yaml文件操作指南

    之前一直從事java開發(fā),習慣了使用yaml文件的格式,尤其是清晰的層次結構、注釋,下面這篇文章主要給大家介紹了關于Golang解析yaml文件的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Go 防止 goroutine 泄露的方法

    Go 防止 goroutine 泄露的方法

    Go 的并發(fā)模型與其他語言不同,雖說它簡化了并發(fā)程序的開發(fā)難度,但如果不了解使用方法,常常會遇到 goroutine 泄露的問題。本篇主要從如何寫出正確代碼的角度來介紹如何防止 goroutine 的泄露,需要的朋友可以參考下
    2019-09-09
  • Golang?Makefile示例深入講解使用

    Golang?Makefile示例深入講解使用

    一次偶然的機會,在?github?上看到有人用?Makefile,就嘗試了一下,發(fā)現(xiàn)真的非常合適,Makefile?本身就是用來描述依賴的,可讀性非常好,而且與強大的?shell?結合在一起,基本可以實現(xiàn)任何想要的功能
    2023-01-01
  • go語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟

    go語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟

    這篇文章主要介紹了go語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟,利用生產(chǎn)的隨機數(shù)采用橢圓加密算法生成公鑰,具體步驟實例代碼請參考下本文
    2021-05-05
  • Go?panic的三種產(chǎn)生方式細節(jié)探究

    Go?panic的三種產(chǎn)生方式細節(jié)探究

    這篇文章主要介紹了Go?panic的三種產(chǎn)生方式細節(jié)探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 簡單四步快速集成go環(huán)境變量

    簡單四步快速集成go環(huán)境變量

    這篇文章主要為大家介紹了快速集成go環(huán)境變量的簡單四個步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Go Println和Printf的區(qū)別詳解

    Go Println和Printf的區(qū)別詳解

    這篇文章主要介紹了Go Println和Printf的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論