golang中的defer panic recover


大家都知道golang裏的panic相當於其他語言裏的throw,而recover相當於其他語言裏的cacth,可是由於golang的recover機制要求必須在defer的函數裏才能執行catch panic

大概意思如下


func protect(g func()) {
	defer func() {
		log.Println("done")  // Println executes normally even if there is a panic
		if x := recover(); x != nil {
			log.Printf("run time panic: %v", x)
		}
	}()
	log.Println("start")
	g()
}

這似乎跟try catch沒啥區別,但是如果我們想實現一個其他語言裏的如下功能時,可就不一樣了


int test() {
    try {
        doSomething();
    }
    catch {
        return 1
    }
    return 2
}

顯然這個函數需要能夠根據有沒有異常發生來返回不同的值,這怎麼辦呢?

其實這個問題與recover以及panic沒啥關係了,這個問題純粹屬於defer的問題了,也即能不能在defer的函數裏修改當前函數的返回值,答案當然是肯定的了,你只需要給返回值命名就行了


func routine() (b bool) {
	defer func() {
		err := recover()
		if err != nil {
			fmt.Printf("err found\n")
			b = true
		}
	}()
	if rand.Int()%10 == 1 {
		panic("hello")
	}
	b = false
	return
}

但是大家往深裏想一下的話,就會覺得這樣實現也挺坑爹的了,比如,裏面有兩處panic的時候,怎麼辦呀?當然是有辦法的了,只是比較醜陋而已,這裏就不舉例說明了。



發佈了217 篇原創文章 · 獲贊 8 · 訪問量 69萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章