• Golang中的error类型


    ####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?
    }
    
  • 相关阅读:
    1026 Table Tennis (30)
    1029 Median
    1025 PAT Ranking (25)
    1017 Queueing at Bank (25)
    1014 Waiting in Line (30)
    1057 Stack (30)
    1010 Radix (25)
    1008 Elevator (20)
    字母大小写转换
    Nmap的基础知识
  • 原文地址:https://www.cnblogs.com/Goden/p/4601598.html
Copyright © 2020-2023  润新知