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

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

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

簡述

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

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

panic

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

recover

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

實(shí)戰(zhàn)

示例1

我們首先在代碼中直接使用recover捕獲異常,并使用panic手動(dòng)拋出一個(gè)異常,看看程序會(huì)怎么樣

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

運(yùn)行上面的代碼之后可以從輸出看到在test函數(shù)中發(fā)生了panic,并且直接終止運(yùn)行,導(dǎo)致main函數(shù)中的打印也沒有生效,這是因?yàn)樵谇懊娴臅r(shí)候有講到過,recover必須在defer延遲函數(shù)中調(diào)用才會(huì)生效。

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ù)中調(diào)用:

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

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

recover:  error
main

示例3

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

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

運(yùn)行上面的代碼之后發(fā)現(xiàn)在defer后面直接調(diào)用recover是無效的,程序照樣會(huì)發(fā)生異常并終止運(yùn)行,所以**recover必須是在defer的延遲函數(shù)中調(diào)用才會(huì)生效。**示例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ù)中調(diào)用,那下面的代碼可以生效嗎?

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

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

main

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

相關(guān)文章

  • Goland 關(guān)閉自動(dòng)移除未使用的包操作

    Goland 關(guān)閉自動(dòng)移除未使用的包操作

    這篇文章主要介紹了Goland 關(guān)閉自動(dòng)移除未使用的包操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 用Go寫一個(gè)輕量級(jí)的ssh批量操作工具的方法

    用Go寫一個(gè)輕量級(jí)的ssh批量操作工具的方法

    這篇文章主要介紹了用Go寫一個(gè)輕量級(jí)的ssh批量操作工具的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • goFrame的gqueue與channe的區(qū)別

    goFrame的gqueue與channe的區(qū)別

    這篇文章主要介紹了goFrame的gqueue與channe的區(qū)別,channel的作用是用于go協(xié)程間的通信,goroutine和channel是支持高并發(fā)的重要組成部分,更多兩者詳細(xì)介紹需要的小伙伴可以參考下面文章內(nèi)容
    2022-06-06
  • 基于Go編寫一個(gè)Windows剪貼板監(jiān)控器

    基于Go編寫一個(gè)Windows剪貼板監(jiān)控器

    這篇文章主要為大家詳細(xì)介紹了如何基于Go編寫一個(gè)Windows剪貼板監(jiān)控器,可以在后臺(tái)默默監(jiān)聽你的復(fù)制行為,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-11-11
  • Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了

    Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了

    這篇文章主要介紹了Golang 定時(shí)器(Timer 和 Ticker),這篇文章就夠了,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Go中零值與空值的實(shí)現(xiàn)與區(qū)別

    Go中零值與空值的實(shí)現(xiàn)與區(qū)別

    本文主要介紹了Go中零值與空值的實(shí)現(xiàn)與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02
  • go語言go?func(){select{}}()的用法

    go語言go?func(){select{}}()的用法

    本文主要介紹了go語言go?func(){select{}}()的用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • 使用Go語言實(shí)現(xiàn)敏感詞過濾功能

    使用Go語言實(shí)現(xiàn)敏感詞過濾功能

    敏感詞過濾,算是一個(gè)比較常見的功能,尤其是在內(nèi)容、社交類應(yīng)用中更是如此,本文介紹如何使用Go語言實(shí)現(xiàn)簡單的敏感詞過濾功能,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Go?log模塊的使用技巧

    Go?log模塊的使用技巧

    Golog模塊是一個(gè)強(qiáng)大的日志記錄庫,提供了豐富的功能,如線程安全的日志記錄、靈活的日志格式配置、多種輸出目標(biāo)支持等,它還提供了錯(cuò)誤處理和程序終止功能,以及自定義Logger的創(chuàng)建,本文給大家介紹Go?log模塊的使用,感興趣的朋友一起看看吧
    2025-11-11
  • 手把手教你如何在Goland中創(chuàng)建和運(yùn)行項(xiàng)目

    手把手教你如何在Goland中創(chuàng)建和運(yùn)行項(xiàng)目

    歡迎來到本指南!我們將手把手地教您在Goland中如何創(chuàng)建、配置并運(yùn)行項(xiàng)目,通過簡單的步驟,您將迅速上手這款強(qiáng)大的集成開發(fā)環(huán)境(IDE),輕松實(shí)現(xiàn)您的編程夢想,讓我們一起開啟這段精彩的旅程吧!
    2024-02-02

最新評(píng)論

隆化县| 炉霍县| 潜山县| 廉江市| 辽源市| 乌鲁木齐市| 兴山县| 达日县| 抚顺县| 双牌县| 黔西县| 延吉市| 南平市| 荥经县| 翁牛特旗| 浦江县| 繁昌县| 读书| 定南县| 都昌县| 绥化市| 郁南县| 依兰县| 平湖市| 桦川县| 沾化县| 南陵县| 五华县| 江华| 英山县| 秦皇岛市| 香港| 察隅县| 荆门市| 县级市| 长海县| 蓬安县| 来宾市| 华安县| 辽宁省| 札达县|