5-自定義errors
阿新 • • 發佈:2022-03-19
Go 語言中的錯誤處理是把錯誤當成一種值來處理,更強調判斷錯誤、處理錯誤,而不是用 catch 捕獲異常
1 異常丟擲與處理
package main import "fmt" func slicePanic() { var s =[]int{4,5,6} fmt.Println(s[9]) } func getCircleArea(radius float32)float32{ if radius<=0{ panic("半徑不能為0") } return 3.14*radius*radius } func recoverSlicePanic() { defer func() { if err:=recover();err!=nil{ fmt.Println(err) } }() slicePanic() } func recoverGetCircleArea(){ defer func() { if err:=recover();err!=nil{ fmt.Println(err) } }() getCircleArea(-9) } func main() { //1 系統丟擲異常 //slicePanic() //2 使用者丟擲異常 //res:=getCircleArea(-2) //fmt.Println(res) // 3 處理系統丟擲異常 //recoverSlicePanic() // 4 處理使用者丟擲異常 recoverGetCircleArea() }
2 返回並處理錯誤
package main import ( "errors" "fmt" ) // 返回錯誤 func getCircleArea(radius float32) (float32, error) { if radius <= 0 { return 0, errors.New("半徑不能小於0") } return 3.14 * radius * radius, nil } func main() { res,err:=getCircleArea(9) if err != nil { fmt.Println(err) }else { fmt.Println("圓的面積為",res) } }
3 Error 介面
3.1 error介面型別
Go 語言中使用一個名為 error
介面來表示錯誤型別。
type error interface {
Error() string
}
error
介面只包含一個方法——Error
,這個函式需要返回一個描述錯誤資訊的字串。
當一個函式或方法需要返回錯誤時,我們通常是把錯誤作為最後一個返回值
由於 error 是一個介面型別,預設零值為nil
。所以我們通常將呼叫函式返回的錯誤與nil
進行比較,以此來判斷函式是否返回錯誤
3.2 建立錯誤
我們可以根據需求自定義 error,最簡單的方式是使用errors
包提供的New
函式建立一個錯誤。
errors.New
func New(text string) error
它接收一個字串引數返回包含該字串的錯誤。我們可以在函式返回時快速建立一個錯誤
if radius <= 0 {
return 0, errors.New("半徑不能小於0")
}
4 自定義錯誤
只要實現了error介面中的Error方法,就叫實現該介面,就是我們自定義的錯誤
package main
import (
"fmt"
)
type radiusError struct {
radius string
}
func (r *radiusError)Error()string {
return "出現錯誤,錯誤原因為:"+r.radius
}
func getCircleArea(radius float32) (float32, error) {
if radius <= 0 {
return 0, &radiusError{radius:"半徑不能小於0",}
}
return 3.14 * radius * radius, nil
}
func main() {
res,err:=getCircleArea(-9)
if err != nil {
fmt.Println(err)
}else {
fmt.Println("圓的面積為",res)
}
}