1. 自定义error

1.1. 抛异常和处理异常

1.1.1. 系统抛

  1. package main
  2. import "fmt"
  3. // 系统抛
  4. func test01() {
  5. a := [5]int{0, 1, 2, 3, 4}
  6. a[1] = 123
  7. fmt.Println(a)
  8. //a[10] = 11
  9. index := 10
  10. a[index] = 10
  11. fmt.Println(a)
  12. }
  13. func getCircleArea(radius float32) (area float32) {
  14. if radius < 0 {
  15. // 自己抛
  16. panic("半径不能为负")
  17. }
  18. return 3.14 * radius * radius
  19. }
  20. func test02() {
  21. getCircleArea(-5)
  22. }
  23. //
  24. func test03() {
  25. // 延时执行匿名函数
  26. // 延时到何时?(1)程序正常结束 (2)发生异常时
  27. defer func() {
  28. // recover() 复活 恢复
  29. // 会返回程序为什么挂了
  30. if err := recover(); err != nil {
  31. fmt.Println(err)
  32. }
  33. }()
  34. getCircleArea(-5)
  35. fmt.Println("这里有没有执行")
  36. }
  37. func test04() {
  38. test03()
  39. fmt.Println("test04")
  40. }
  41. func main() {
  42. test04()
  43. }

1.1.2. 返回异常

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. func getCircleArea(radius float32) (area float32, err error) {
  7. if radius < 0 {
  8. // 构建个异常对象
  9. err = errors.New("半径不能为负")
  10. return
  11. }
  12. area = 3.14 * radius * radius
  13. return
  14. }
  15. func main() {
  16. area, err := getCircleArea(-5)
  17. if err != nil {
  18. fmt.Println(err)
  19. } else {
  20. fmt.Println(area)
  21. }
  22. }

1.1.3. 自定义error:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "time"
  6. )
  7. type PathError struct {
  8. path string
  9. op string
  10. createTime string
  11. message string
  12. }
  13. func (p *PathError) Error() string {
  14. return fmt.Sprintf("path=%s \nop=%s \ncreateTime=%s \nmessage=%s", p.path,
  15. p.op, p.createTime, p.message)
  16. }
  17. func Open(filename string) error {
  18. file, err := os.Open(filename)
  19. if err != nil {
  20. return &PathError{
  21. path: filename,
  22. op: "read",
  23. message: err.Error(),
  24. createTime: fmt.Sprintf("%v", time.Now()),
  25. }
  26. }
  27. defer file.Close()
  28. return nil
  29. }
  30. func main() {
  31. err := Open("/Users/5lmh/Desktop/go/src/test.txt")
  32. switch v := err.(type) {
  33. case *PathError:
  34. fmt.Println("get path error,", v)
  35. default:
  36. }
  37. }

输出结果:

  1. get path error, path=/Users/pprof/Desktop/go/src/test.txt
  2. op=read
  3. createTime=2018-04-05 11:25:17.331915 +0800 CST m=+0.000441790
  4. message=open /Users/pprof/Desktop/go/src/test.txt: no such file or directory