异常处理

 

 

【暴力处理】恐慌异常处理

 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  */

 

 

 

 

posted @ 2019-12-03 11:55  chaoyangxu  阅读(201)  评论(0编辑  收藏  举报