异常处理
【暴力处理】恐慌异常处理
1 //【暴力方式】求球的体积 2 //半径如果为负数,直接panic 3 4 package main 5 6 import ( 7 "fmt" 8 "math" 9 ) 10 11 //球的函数 面积公式 12 func GetToyBallVolumn(radius float64) float64 { 13 14 //【模拟恐慌】就是定义报错内容,让程序崩掉,抛出异常. 15 if radius < 0 { 16 panic("小球半径不能为负数...") 17 } 18 19 return (4 / 3.0) * math.Pi * math.Pow(radius, 3) 20 } 21 22 func main() { 23 24 //【处理恐慌】从恐慌中复活,找到恐慌的原因,在函数结束之前,处理恐慌 25 defer func() { 26 if err := recover(); err != nil { 27 fmt.Println("致死的原因是: ", err) 28 } 29 30 }() 31 32 //因为传递了负数半径死于此处. 33 volumn := GetToyBallVolumn(-1) 34 fmt.Println("球的体积是: ", volumn) 35 36 } 37 38 /* 39 致死的原因是: 小球半径不能为负数... 40 */
[温和处理]错误和处理
1 //【温和方式报错】半径如果不在取值范围内,温和地返回【结果-错误】 2 3 package main 4 5 import ( 6 "errors" 7 "fmt" 8 "math" 9 ) 10 11 //球的函数 面积公式 12 func GetToyBallVolumn(radius float64) (volumn float64, err error) { 13 14 //【模拟恐慌】就是定义报错内容,让程序崩掉,抛出异常. 15 if radius < 0 { 16 panic("小球半径不能为负数...") 17 } 18 19 //半径如果不在取值范围内,温和的返回错误. 20 if radius < 5 || radius > 50 { 21 err = errors.New("合法的半径范围是[5-50]") 22 return 23 } 24 25 return (4 / 3.0) * math.Pi * math.Pow(radius, 3), nil 26 } 27 28 func main() { 29 volumn, err := GetToyBallVolumn(1) 30 if err != nil { 31 fmt.Println("获取体积失败:", err) 32 return 33 } 34 fmt.Println("小球的体积是,", volumn) 35 } 36 /* 37 获取体积失败: 合法的半径范围是[5-50] 38 39 */
自定义错误
1 package main 2 3 import ( 4 "fmt" 5 "math" 6 ) 7 8 //自定义异常InvalidRadiusError 9 type InvalidRadiusError struct { 10 //非法半径 11 Radius float64 12 //可接受最小半径 13 MinRadius float64 14 //可接受最大半径 15 MaxRadius float64 16 } 17 18 func (ire *InvalidRadiusError) Error() string { 19 //Sprintf的意思是不打印内容,把结果返回给变量,自己知道怎么用. 20 info := fmt.Sprintf("%.2f是非法半径,合法半径的范围是[%.2f,%.2f]\n", ire.Radius, ire.MinRadius, ire.MaxRadius) 21 return info 22 } 23 24 //工厂方法 25 func NewInvalidRadiusError(radius float64) *InvalidRadiusError { 26 ire := new(InvalidRadiusError) 27 ire.MinRadius = 5 28 ire.MaxRadius = 50 29 ire.Radius = radius 30 return ire 31 } 32 33 //球的函数 面积公式 34 func GetToyBallVolumn(radius float64) (volumn float64, err error) { 35 36 //【模拟恐慌】就是定义报错内容,让程序崩掉,抛出异常. 37 if radius < 0 { 38 panic(NewInvalidRadiusError(radius)) 39 } 40 41 //半径如果不在取值范围内,温和的返回错误. 42 if radius < 5 || radius > 50 { 43 err = NewInvalidRadiusError(radius) 44 return 45 } 46 47 return (4 / 3.0) * math.Pi * math.Pow(radius, 3), nil 48 } 49 50 func main() { 51 52 //解决恐慌问题,避免程序报错退出。 53 defer func() { 54 if err := recover();err !=nil{ 55 fmt.Println(err) 56 } 57 }() 58 59 60 volumn, err := GetToyBallVolumn(-1) 61 if err != nil { 62 fmt.Println("获取体积失败:", err) 63 return 64 } 65 fmt.Println("小球的体积是,", volumn) 66 } 67 68 /* 69 获取体积失败: 1.00是非法半径,合法半径的范围是[5.00,50.00] 70 -1.00是非法半径,合法半径的范围是[5.00,50.00] 71 72 */