1 package main
2
3 import "fmt"
4
5 type areaError struct {
6 msg string // 错误的描述
7 lenght float64 // 发生错误的时候,矩形的长度
8 width float64 // 发生错误的时候,矩形的宽度
9 }
10
11 func (e *areaError) Error() string {
12 return e.msg
13 }
14
15 func (e *areaError) legnthNegative() bool {
16 return e.lenght < 0
17 }
18
19 func (e *areaError) widthNegative() bool {
20 return e.width < 0
21 }
22
23 func rectArea(length, width float64) (float64, error) {
24 msg := ""
25 if length < 0 {
26 msg = "长度小于零"
27 }
28 if width < 0 {
29 if msg == "" {
30 msg = "宽度小于零"
31 } else {
32 msg += ",宽度也小于零"
33 }
34 }
35
36 if msg != "" {
37 return 0, &areaError{msg, length, width}
38 }
39 return length * width, nil
40 }
41
42 func main() {
43 length, width := 6.7, -9.1
44 area, err := rectArea(length, width)
45 if err != nil {
46 fmt.Println(err) // 宽度小于零
47 if err, ok := err.(*areaError); ok {
48 if err.legnthNegative() {
49 fmt.Printf("error:长度,%.2f,小于零\n", err.lenght)
50 }
51 if err.widthNegative() {
52 fmt.Printf("error:宽度,%.2f,小于零\n", err.width)
53 // error:宽度,-9.10,小于零
54 }
55 }
56 return
57 }
58 fmt.Println("矩形的面积是:", area)
59 }