1 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
恐慌類似于異常,但不會(huì)傳遞給調(diào)用者(也就是說,當(dāng)您調(diào)用恐慌時(shí),它會(huì)立即發(fā)生;您無需等待)。您應(yīng)該使用代碼的第一個(gè)示例,您可以在其中嘗試操作、失敗并繼續(xù)。
func main() {
s1 := rand.NewSource(time.Now().UnixNano())
r1 := rand.New(s1)
// Generate some random numbers, and call into add()
for i := 0; i < 10; i++ {
s, err := add(r1.Intn(100), r1.Intn(100))
if err != nil {
fmt.Println(err)
continue
}
fmt.Println(s)
}
}
// Error if we get a sum over 100
func add(a int, b int) (int, error) {
s := a + b
if s > 100 {
return s, errors.New("Hey doofus, error!")
}
return s, nil
}
如果你在這個(gè)例子中恐慌,你就大功告成了(試試它——而不是返回一個(gè)錯(cuò)誤做恐慌(“一些錯(cuò)誤”)。但是相反,我們確定有一個(gè)錯(cuò)誤,我們可以嘗試生成另一個(gè)隨機(jī)數(shù)字。
就像其他人所說的那樣,如果您有一個(gè)無法恢復(fù)的用例(假設(shè)您試圖從文件中讀取,但文件不在那里),您可能會(huì)決定最好恐慌。但是如果你有一個(gè)長時(shí)間運(yùn)行的進(jìn)程(比如一個(gè) API),你會(huì)想要繼續(xù)攪動(dòng),盡管有任何錯(cuò)誤。
GoPlay 在這里:http ://play.golang.org/p/ThXTxVfM6R
OP 用用例更新了他的帖子——他正在嘗試轉(zhuǎn)換為一種類型。如果你在這個(gè)函數(shù)中恐慌,你會(huì)死在水里。相反,我們想要返回一個(gè)錯(cuò)誤,讓調(diào)用者決定如何處理錯(cuò)誤。以此為例:
func interfaceToString(i interface{}) (string, error) {
if i == nil {
return "", errors.New("nil interface")
}
switch i.(type) {
case string:
return i.(string), nil
case float64:
return strconv.Itoa(int(i.(float64))), nil
case int:
return strconv.Itoa(i.(int)), nil
}
return "", errors.New(fmt.Sprintf("Unable to convert %v", i))
}
GoPlay 在這里:http ://play.golang.org/p/7y7v151EH4
- 1 回答
- 0 關(guān)注
- 151 瀏覽
添加回答
舉報(bào)