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

go 異常處理panic和recover的簡單實踐

 更新時間:2025年04月01日 10:42:53   作者:6<7  
在Go語言中,異常處理主要通過panic和recover這兩個內(nèi)建函數(shù)來實現(xiàn),本文主要介紹了go異常處理panic和recover的簡單實踐,具有一定的參考價值,感興趣的可以了解一下

panic 和 recover

當然能觸發(fā)程序宕機退出的,也可以是我們自己,比如經(jīng)過檢查判斷,當前環(huán)境無法達到我們程序進行的預期條件時(比如一個服務指定監(jiān)聽端口被其他程序占用),可以手動觸發(fā) panic,讓程序退出停止運行。

1. 觸發(fā)panic

手動觸發(fā)宕機,是非常簡單的一件事,只需要調(diào)用 panic 這個內(nèi)置函數(shù)即可,就像這樣子

package main

func main() {
    panic("crash")
}

運行結(jié)果:

panic: crash

goroutine 1 [running]:
main.main()
        d:/Goworks/src/尚硅谷/異常處理/demo01.go:4 +0x25
exit status 2

2. 捕獲 panic

發(fā)生了異常,有時候就得捕獲,就像 Python 中的except 一樣,那 Golang 中是如何做到的呢?

這就不得不引出另外一個內(nèi)建函數(shù) – recover,它可以讓程序在發(fā)生宕機后起生回生。

但是 recover 的使用,有一個條件,就是它必須在 defer 函數(shù)中才能生效,其他作用域下,它是不工作的。

這是一個簡單的例子

package main

import "fmt"

func set_data(x int) {
    defer func() {
        // recover() 可以將捕獲到的panic信息打印
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()

    // 故意制造數(shù)組越界,觸發(fā) panic
    var arr [10]int
    arr[x] = 88
}

func main() {
    set_data(20)

    // 如果能執(zhí)行到這句,說明panic被捕獲了
    // 后續(xù)的程序能繼續(xù)運行
    fmt.Println("everything is ok")
}

運行結(jié)果:

捕獲到panic后正常運行。

runtime error: index out of range [20] with length 10
everything is ok

3. 無法跨協(xié)程

從上面的例子,可以看到,即使 panic 會導致整個程序退出,但在退出前,若有 defer 延遲函數(shù),還是得執(zhí)行完 defer 。

但是這個 defer 在多個協(xié)程之間是沒有效果,在子協(xié)程里觸發(fā) panic,只能觸發(fā)自己協(xié)程內(nèi)的 defer,而不能調(diào)用 main 協(xié)程里的 defer 函數(shù)的。

來做個實驗就知道了

package main

import (
    "fmt"
    "time"
)

func main() {
    // 這個 defer 并不會執(zhí)行
    defer fmt.Println("in main")

    go func() {
        defer println("in goroutine")
		// 這個panic就會終止程序
		// 在這終止了外面的defer也不會執(zhí)行
        panic("")
    }()

    time.Sleep(2 * time.Second)
}

輸出如下,并沒有執(zhí)行defer fmt.Println(“in main”)

in goroutine
panic:

goroutine 19 [running]:
main.main.func1()
        d:/Goworks/src/尚硅谷/異常處理/demo03.go:14 +0x3e
created by main.main in goroutine 1
        d:/Goworks/src/尚硅谷/異常處理/demo03.go:12 +0x59
exit status 2

4. 總結(jié)

Golang 異常的拋出與捕獲,依賴兩個內(nèi)置函數(shù):

  • panic:拋出異常,使程序崩潰
  • recover:捕獲異常,恢復程序或做收尾工作(通常來說,不應該對進入 panic 宕機的程序做任何處理,但有時,需要我們可以從宕機中恢復,至少我們可以在程序崩潰前,做一些操作,舉個例子,當 web 服務器遇到不可預料的嚴重問題時,在崩潰前應該將所有的連接關閉,如果不做任何處理,會使得客戶端一直處于等待狀態(tài),如果 web 服務器還在開發(fā)階段,服務器甚至可以將異常信息反饋到客戶端,幫助調(diào)試。)

revocer 調(diào)用后,拋出的 panic 將會在此處終結(jié),不會再外拋,但是 recover,并不能任意使用,它有強制要求,必須得在 defer 下才能發(fā)揮用途。

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

相關文章

  • Go語言中slice類型的使用小結(jié)

    Go語言中slice類型的使用小結(jié)

    本文主要介紹了Go語言中slice類型的使用小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03
  • Go語言遍歷目錄的三種方法舉例

    Go語言遍歷目錄的三種方法舉例

    學習io之后,尤其是文件操作,我們就可以遍歷給定的目錄了,這篇文章主要給大家介紹了關于Go語言遍歷目錄的三種方法,分別是ioutil.ReadDir、filepath.Walk以及filepath.Glob,需要的朋友可以參考下
    2023-11-11
  • Go Web后臺管理系統(tǒng)項目實現(xiàn)

    Go Web后臺管理系統(tǒng)項目實現(xiàn)

    本文主要介紹了Go Web后臺管理系統(tǒng)項目實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-05-05
  • go語言遍歷文件夾示例

    go語言遍歷文件夾示例

    這篇文章主要介紹了go語言遍歷文件夾示例,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • golang?JSON序列化和反序列化示例詳解

    golang?JSON序列化和反序列化示例詳解

    通過使用Go語言的encoding/json包,你可以輕松地處理JSON數(shù)據(jù),無論是在客戶端應用、服務器端應用還是其他類型的Go程序中,這篇文章主要介紹了golang?JSON序列化和反序列化,需要的朋友可以參考下
    2024-04-04
  • 使用Go實現(xiàn)文件復制的完整流程

    使用Go實現(xiàn)文件復制的完整流程

    本案例將實現(xiàn)一個實用的文件操作工具:將一個文件的內(nèi)容完整復制到另一個文件中, 這是文件處理中的常見任務,比如配置文件備份、日志遷移、用戶上傳文件轉(zhuǎn)存等,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2025-07-07
  • 關于Golang獲取當前項目絕對路徑的問題

    關于Golang獲取當前項目絕對路徑的問題

    這篇文章主要介紹了Golang獲取當前項目絕對路徑的問題,通常的做法是go run用于本地開發(fā),用一個命令中快速測試代碼確實非常方便;在部署生產(chǎn)環(huán)境時,我們會通過go build構建出二進制文件然后上傳到服務器再去執(zhí)行,那么會產(chǎn)生什么問題呢?感興趣的朋友一起看看吧
    2022-04-04
  • Golang正則表達式判斷手機號或身份證方法實例

    Golang正則表達式判斷手機號或身份證方法實例

    日常使用一些軟件時會通過手機號碼來注冊,這就會用到正則表達式來判斷號碼是否正確,下面這篇文章主要給大家介紹了關于Golang正則表達式判斷手機號或身份證的相關資料,需要的朋友可以參考下
    2022-07-07
  • Go實現(xiàn)線程池(工作池)的兩種方式實例詳解

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

    這篇文章主要介紹了Go實現(xiàn)線程池(工作池)的兩種方式實例詳解,需要的朋友可以參考下
    2022-04-04
  • jenkins配置golang?代碼工程自動發(fā)布的實現(xiàn)方法

    jenkins配置golang?代碼工程自動發(fā)布的實現(xiàn)方法

    這篇文章主要介紹了jenkins配置golang?代碼工程自動發(fā)布,jks是個很好的工具,使用方法也很多,我只用了它簡單的功能,對jenkins配置golang相關知識感興趣的朋友一起看看吧
    2022-07-07

最新評論

天水市| 新龙县| 当雄县| 宁安市| 平湖市| 扶余县| 昌平区| 博野县| 靖州| 定远县| 南宫市| 神木县| 松溪县| 商丘市| 尚志市| 杂多县| 正阳县| 镇巴县| 赞皇县| 德惠市| 定南县| 察隅县| 焉耆| 天门市| 隆化县| 永丰县| 上犹县| 莱西市| 五莲县| 边坝县| 弥勒县| 彭山县| 图木舒克市| 宜君县| 墨玉县| 松阳县| 临海市| 左云县| 邢台县| 察雅县| 儋州市|