Golang中的error类型
error类型本身就是一个预定义好的接口,里面定义了一个method
type error interface { Error() string }
生成一个新的error并返回
一般有以下几种处理方式:
package main import ( "errors" "fmt" ) type Customerror struct { infoa string infob string Err error } func (cerr Customerror) Error() string { errorinfo := fmt.Sprintf("infoa : %s , infob : %s , original err info : %s ", cerr.infoa, cerr.infob, cerr.Err.Error()) return errorinfo } func main() { //方法一: //采用errors包的New方法 返回一个err的类型 var err error = errors.New("this is a new error") //由于已经实现了error接口的方法 因此可以直接调用对应的方法 fmt.Println(err.Error()) //方法二: //采用fmt.Errof 将string信息转化为error信息 并返回 err = fmt.Errorf("%s", "the error test for fmt.Errorf") fmt.Println(err.Error()) //方法三: //采用自定义的方式实现一个error的 一个duck 类型 err = &Customerror{ infoa: "err info a", infob: "err info b", Err: errors.New("test custom err"), } fmt.Println(err.Error()) } /*output: this is a new error the error test for fmt.Errorf infoa : err info a , infob : err info b , original err info : test custom err */
golang中的 error package 内容也比较简单,这个package中实现了error中所声明的method(Error)相当于是一个error接口的duck类型。
// Package errors implements functions to manipulate errors. package errors // New returns an error that formats as the given text. func New(text string) error { return &errorString{text} } // errorString is a trivial implementation of error. type errorString struct { s string } func (e *errorString) Error() string { return e.s }
采用fmt.Errorf方法把string类型转化为error类型,在这个方法的内部,先调用fmt包中的Sprintf方法把格式化的输入转化为字符串,在使用 errors.New 方法返回error类型。
采用自定义的error类型可以先判断err的动态类型,再进行下一层的判断。
比如net.Error接口,是一个对原先error接口的再封装。在读取文件的时候判断读取器读取结束的时候的io.EOF。
//io.EOF var EOF = errors.New("EOF") //net.Error type Error interface { error Timeout() bool // Is the error a timeout? Temporary() bool // Is the error temporary? }
来源:https://www.cnblogs.com/Goden/p/4601598.html