Golang中的error类型
error类型本身就是一个预定义好的接口,里面定义了一个method

  1. type error interface {
  2. Error() string
  3. }

生成一个新的error并返回
一般有以下几种处理方式:

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. type Customerror struct {
  7. infoa string
  8. infob string
  9. Err error
  10. }
  11. func (cerr Customerror) Error() string {
  12. errorinfo := fmt.Sprintf("infoa : %s , infob : %s , original err info : %s ", cerr.infoa, cerr.infob, cerr.Err.Error())
  13. return errorinfo
  14. }
  15. func main() {
  16. //方法一:
  17. //采用errors包的New方法 返回一个err的类型
  18. var err error = errors.New("this is a new error")
  19. //由于已经实现了error接口的方法 因此可以直接调用对应的方法
  20. fmt.Println(err.Error())
  21. //方法二:
  22. //采用fmt.Errof 将string信息转化为error信息 并返回
  23. err = fmt.Errorf("%s", "the error test for fmt.Errorf")
  24. fmt.Println(err.Error())
  25. //方法三:
  26. //采用自定义的方式实现一个error的 一个duck 类型
  27. err = &Customerror{
  28. infoa: "err info a",
  29. infob: "err info b",
  30. Err: errors.New("test custom err"),
  31. }
  32. fmt.Println(err.Error())
  33. }
  34. /*output:
  35. this is a new error
  36. the error test for fmt.Errorf
  37. infoa : err info a , infob : err info b , original err info : test custom err
  38. */

golang中的 error package 内容也比较简单,这个package中实现了error中所声明的method(Error)相当于是一个error接口的duck类型。

  1. // Package errors implements functions to manipulate errors.
  2. package errors
  3. // New returns an error that formats as the given text.
  4. func New(text string) error {
  5. return &errorString{text}
  6. }
  7. // errorString is a trivial implementation of error.
  8. type errorString struct {
  9. s string
  10. }
  11. func (e *errorString) Error() string {
  12. return e.s
  13. }

采用fmt.Errorf方法把string类型转化为error类型,在这个方法的内部,先调用fmt包中的Sprintf方法把格式化的输入转化为字符串,在使用 errors.New 方法返回error类型。

采用自定义的error类型可以先判断err的动态类型,再进行下一层的判断。
比如net.Error接口,是一个对原先error接口的再封装。在读取文件的时候判断读取器读取结束的时候的io.EOF。

  1. //io.EOF
  2. var EOF = errors.New("EOF")
  3. //net.Error
  4. type Error interface {
  5. error
  6. Timeout() bool // Is the error a timeout?
  7. Temporary() bool // Is the error temporary?
  8. }

参考:https://www.cnblogs.com/Goden/p/4601598.html

分类: web

标签:   golang