golang 异常处理总结

参考博客

参考 知乎的博客

1. switch case 处理 return的 问题

2. goto 处理golang return 太多 如何解决

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import (
	"errors"
	"fmt"
)
 
func GetOK() interface{} {
	return errors.New("error")
}
func main() {
	var res = GetOK()
	if res != nil {
		goto errHandle
	} else {

		fmt.Println("do it ")

	}

	fmt.Println("success")
	return

errHandle:
	fmt.Println("handle err")
}
  1. 使用 defer来解决
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package main

import (
	"errors"
	"fmt"
)

func GetOK(msg string) error {
	var err error

	if msg == "" {
		return nil
	}
	err = errors.New("basic err" + msg)
	return err
}

func handleErrOrOk(err error, data string) {
	switch {
	case err != nil:
		fmt.Printf("error info is %v", err)
	default:
		fmt.Println("success result = ", data)
	}
}
func main() {

	var err error
	var data string
	defer func() {
		handleErrOrOk(err, data)
	}()

	err = GetOK("")
	if err != nil {
		err = errors.New("wrap err: <-" + err.Error())
		return
	}
	err = GetOK("")
	if err != nil {
		err = errors.New("wrap error2 : <- " + err.Error())
		return
	}

	err = GetOK("current error")

	if err != nil {
		err = errors.New("it is error 3: <-" + err.Error())
		return
	}

	fmt.Println("it is success")

}

个人小结

  1. switch-case 处理
  2. goto处理 【据说 linux 内核很多这种,但是不建议用 goto】
  3. defer 中判断 是否不为 nil 并且包装,然后处理