Golang中的error类型

Goden · · 41339 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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?
}

本文来自:博客园

感谢作者:Goden

查看原文:Golang中的error类型

41339 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传