【暴力处理】恐慌异常处理
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]
", 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 */