golang中的defer panic使用方法
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。大家都知道golang裡的panic相當於其他語言裡的throw,而recover相當於其他語言裡的cacth,可是由於golang的recover機制要求必須在defer的函數裡才能執行catchpanic
大概意思如下
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 timepanic: %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("errfound\n") b = true } }() if rand.Int() == 1 { panic("hello") } b = false return}
但是大家往深裡想一下的話,就會覺得這樣實現也挺坑爹的了,比如,裡面有兩處panic的時候,怎麼辦呀?當然是有辦法的了,只是比較醜陋而已,這裡就不舉例說明了。
本篇文章來源於 Linux公社網站(www.linuxidc.com) 原文連結:http://www.linuxidc.com/Linux/2013-04/83105.htm