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

golang?recover函數(shù)使用中的一些坑解析

 更新時間:2023年03月19日 11:22:07   作者:機器馬喝啤酒  
這篇文章主要為大家介紹了golang?recover函數(shù)使用中的一些坑解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

眾所周知golang 中recover函數(shù)可以捕捉panic,防止在出現(xiàn)異常的情況下服務(wù)整個不可用。然而某些情況下recover也無法catch panic。下面就會說一些這些情況。

一,正常情況下

package?main
import?"fmt"
func?main(){
????defer?func(){
????????if?err?:=?recover();err?!=?nil{
????????????fmt.Printf("err?=?%v",err)
????????}
????}()
????panic("a?panic")
}
打印結(jié)果:
err?=?a?panic
Process?finished?with?exit?code?0

能正常catch panic

二, goroutine中panic 

之前線上環(huán)境出現(xiàn)過接口出現(xiàn)panic導(dǎo)致服務(wù)不可用的情況,于是同事就直接在main函數(shù)加了個recover認(rèn)為萬事無憂了。實際上recover并不能捕捉到協(xié)程中的panic。

package?main
import?"fmt"
func?main(){
????defer?func(){
????????if?err?:=?recover();err?!=?nil{
????????????fmt.Printf("err?=?%v",err)
????????}
????}()
????go?func(){
????????panic("a?panic")
????}()
????select{}
}
打印結(jié)果:
panic:?a?panic
goroutine?6?[running]:
main.main.func2()
????I:/goProject/catchPanic.go:13?+0x40
created?by?main.main
????I:/goProject/catchPanic.go:12?+0x5e

實際上還是會panic導(dǎo)致服務(wù)不可用。

正確寫法

package?main
import?"fmt"
func?main(){
????go?func(){
????????defer?func(){
????????????if?err?:=?recover();err?!=?nil{
????????????????fmt.Printf("err?=?%v",err)
????????????}
????????}()
????????panic("a?panic")
????}()
????select?{}
}
返回值:
fatal?error:?all?goroutines?are?asleep?-?deadlock!
goroutine?1?[select?(no?cases)]:
main.main()
????I:/goProject/catchPanic.go:15?+0x41
err?=?a?panic
Process?finished?with?exit?code?2

可以看到panic被正常捕捉,同時因為select語句陷入阻塞,報了一個死鎖的錯。

三,間接調(diào)用recover

在我想要把recover封裝成成一個函數(shù)的時候,發(fā)現(xiàn)recover并沒有生效,因為recover只有在被defer語句直接調(diào)用的時候才會生效。當(dāng)recover在其他函數(shù)內(nèi)部的時候無法正確捕捉到panic。

package?main
import?"fmt"
func?main(){
????defer?cover()
????panic("a?panic")
}
func?cover(){
????defer?func(){
????????if?err?:=?recover();err!=?nil{
????????????fmt.Println(err)
????????}
????}()
}
返回值:
panic:?a?panic
goroutine?1?[running]:
main.main()
????I:/goProject/catchPanic.go:7?+0x62

四,nil panic

panic要被捕捉,還需要滿足一種條件,就是panic不是nil panic,否則在進行捕獲判斷的時候無法知道是panic沒有發(fā)生還是panic本身就是nil。

例如以下代碼

package?main
import?"fmt"
func?main()?{
????defer?func(){
????????if?err?:=?recover();err?!=?nil{
????????????fmt.Println(err)
????????}
????????fmt.Println("after?recover")
????}()
????panic(nil)
????select{}
}
返回值:
after?recover

recover并沒有正確處理異常,因為異常的值為nil。

五,總結(jié)

這篇文章講述了三種recover會失效的情況。

  •  攜程中出現(xiàn)panic
  • defer不直接調(diào)用recover
  • panic的值為nil值

寫代碼的時候需要注意避免因為這幾種情況的出現(xiàn)而導(dǎo)致服務(wù)不可用。以上就是golang新手常遇見的一些坑。

以上就是golang recover函數(shù)使用中的一些坑解析的詳細(xì)內(nèi)容,更多關(guān)于golang recover函數(shù)坑的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Go中Set的實現(xiàn)方式

    詳解Go中Set的實現(xiàn)方式

    這篇文章主要介紹了詳解Go中Set的實現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Go字符串切片操作str1[:index]的使用

    Go字符串切片操作str1[:index]的使用

    Go字符串切片str1[:index]從起始位置0到index-1截取,不復(fù)制數(shù)據(jù),利用字符串不可變性和共享內(nèi)存機制提升性能,具有一定的參考價值,感興趣的可以了解一下
    2025-06-06
  • go自動下載所有的依賴包go module使用詳解

    go自動下載所有的依賴包go module使用詳解

    這篇文章主要介紹了go自動下載所有的依賴包go module使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • golang 隨機數(shù)的兩種方式

    golang 隨機數(shù)的兩種方式

    本文主要介紹了golang 隨機數(shù)的兩種方式,一種是偽隨機,另一種是真隨機,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • go語言數(shù)據(jù)類型之字符串string

    go語言數(shù)據(jù)類型之字符串string

    這篇文章介紹了go語言數(shù)據(jù)類型之字符串string,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Golang 并發(fā)讀寫鎖的具體實現(xiàn)

    Golang 并發(fā)讀寫鎖的具體實現(xiàn)

    Go語言中的sync.RWMutex提供了讀寫鎖機制,允許多個協(xié)程并發(fā)讀取共享資源,但在寫操作時保持獨占性,本文主要介紹了Golang 并發(fā)讀寫鎖的具體實現(xiàn),感興趣的可以了解一下
    2025-02-02
  • golang gc的內(nèi)部優(yōu)化詳細(xì)介紹

    golang gc的內(nèi)部優(yōu)化詳細(xì)介紹

    Go編譯器在垃圾回收(GC)的掃描標(biāo)記階段,對存儲無指針鍵值對的map進行了優(yōu)化,即在GC掃描時不深入掃描map內(nèi)部數(shù)據(jù),只檢查map本身是否需要回收,這一優(yōu)化顯著提升了GC掃描的速度,從而減少了GC對程序性能的影響
    2024-10-10
  • Go語言學(xué)習(xí)之Switch語句的使用

    Go語言學(xué)習(xí)之Switch語句的使用

    這篇文章主要通過一些示例為大家介紹一下Go語言中Switch語句的基本語法以及使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-06-06
  • 詳解go語言中并發(fā)安全和鎖問題

    詳解go語言中并發(fā)安全和鎖問題

    這篇文章主要介紹了go語言中并發(fā)安全和鎖問題,包含互斥鎖解鎖過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • Golang?websocket協(xié)議使用淺析

    Golang?websocket協(xié)議使用淺析

    這篇文章主要介紹了Golang?websocket協(xié)議的使用,WebSocket是一種新型的網(wǎng)絡(luò)通信協(xié)議,可以在Web應(yīng)用程序中實現(xiàn)雙向通信,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05

最新評論

游戏| 昭觉县| 普兰县| 江孜县| 横峰县| 双柏县| 施甸县| 株洲县| 博白县| 永春县| 中牟县| 当涂县| 樟树市| 夏津县| 萝北县| 酒泉市| 阳朔县| 阿拉善右旗| 射阳县| 徐州市| 麟游县| 青田县| 昔阳县| 昌宁县| 定襄县| 醴陵市| 陇西县| 宣化县| 永安市| 茶陵县| 奉节县| 肇源县| 屏南县| 白银市| 禹城市| 通江县| 湟中县| 乌鲁木齐市| 方城县| 沅江市| 东方市|