1 回答

TA貢獻1828條經驗 獲得超4個贊
恐慌類似于異常,但不會傳遞給調用者(也就是說,當您調用恐慌時,它會立即發生;您無需等待)。您應該使用代碼的第一個示例,您可以在其中嘗試操作、失敗并繼續。
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
}
如果你在這個例子中恐慌,你就大功告成了(試試它——而不是返回一個錯誤做恐慌(“一些錯誤”)。但是相反,我們確定有一個錯誤,我們可以嘗試生成另一個隨機數字。
就像其他人所說的那樣,如果您有一個無法恢復的用例(假設您試圖從文件中讀取,但文件不在那里),您可能會決定最好恐慌。但是如果你有一個長時間運行的進程(比如一個 API),你會想要繼續攪動,盡管有任何錯誤。
GoPlay 在這里:http ://play.golang.org/p/ThXTxVfM6R
OP 用用例更新了他的帖子——他正在嘗試轉換為一種類型。如果你在這個函數中恐慌,你會死在水里。相反,我們想要返回一個錯誤,讓調用者決定如何處理錯誤。以此為例:
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 關注
- 153 瀏覽
添加回答
舉報