Go(十三)Error接口和错误处理
创始人
2024-01-28 00:42:14
0

        Go 语言中的错误处理与其他语言不太一样,它把错误当成一种值来处理,更强调判断错误、处理错误,而不是一股脑的 catch 捕获异常。

目录

Error 接口

Error 接口

创建错误

fmt.Errorf

错误结构体类型


Error 接口

        Go 语言中把错误当成一种特殊的值来处理,不支持其他语言中使用try/catch捕获异常的方式。

Error 接口

Go 语言中使用一个名为 error 接口来表示错误类型。

type error interface {Error() string
}

        error 接口只包含一个方法——Error,这个函数需要返回一个描述错误信息的字符串。

        当一个函数或方法需要返回错误时,我们通常是把错误作为最后一个返回值。例如下面标准库 os 中打开文件的函数。

func Open(name string) (*File, error) {return OpenFile(name, O_RDONLY, 0)
}

        由于 error 是一个接口类型,默认零值为nil。所以我们通常将调用函数返回的错误与nil进行比较,以此来判断函数是否返回错误。例如你会经常看到类似下面的错误判断代码。

file, err := os.Open("./xx.go")
if err != nil {fmt.Println("打开文件失败,err:", err)return
}

注意

        当我们使用fmt包打印错误时会自动调用 error 类型的 Error 方法,也就是会打印出错误的描述信息。

创建错误

我们可以根据需求自定义 error,最简单的方式是使用errors 包提供的New函数创建一个错误。

errors.New

函数签名如下,

func New(text string) error

它接收一个字符串参数返回包含该字符串的错误。我们可以在函数返回时快速创建一个错误。

func queryById(id int64) (*Info, error) {if id <= 0 {return nil, errors.New("无效的id")}// ...
}

或者用来定义一个错误变量,例如标准库io.EOF错误定义如下。

var EOF = errors.New("EOF")

fmt.Errorf

当我们需要传入格式化的错误描述信息时,使用fmt.Errorf是个更好的选择。

fmt.Errorf("查询数据库失败,err:%v", err)

但是上面的方式会丢失原有的错误类型,只拿到错误描述的文本信息。

为了不丢失函数调用的错误链,使用fmt.Errorf时搭配使用特殊的格式化动词%w,可以实现基于已有的错误再包装得到一个新的错误。

fmt.Errorf("查询数据库失败,err:%w", err)

对于这种二次包装的错误,errors包中提供了以下三个方法。

func Unwrap(err error) error                 // 获得err包含下一层错误
func Is(err, target error) bool              // 判断err是否包含target
func As(err error, target interface{}) bool  // 判断err是否为target类型

错误结构体类型

        此外我们还可以自己定义结构体类型,实现`error接口。

// OpError 自定义结构体类型
type OpError struct {Op string
}// Error OpError 类型实现error接口
func (e *OpError) Error() string {return fmt.Sprintf("无权执行%s操作", e.Op)
}

相关内容

热门资讯

新型中小投资项目 5个项目 新... 提起适合穷人的18个创业项目小投资的都有哪些,想必大家都有一定了解,有人问请问现在新型投资项目有哪些...
学生自主创业 学生自主创业 学... 以下是西安领军教育集团董事长吕鹏程在2012腾讯大秦网教育论坛主题演讲:学生自主创业不能说的秘密实录...
一个合适的创业合作伙伴很重要 ... 找到一个合适的创业合作伙伴那样的话,成功率就会大很多,可是要如何才能找到一个好的合作伙伴呢?下面由小...
学生自主创业项目 学生自主创业...   :保健面包房开一家面包店投资不大,对很多人来说是件容易的事。但用传统的烤制方式再加上传统的配料,...
深圳创业项目 深圳创业项目 深... 深圳市一个人杰地灵的地方,南方城市的标杆,很多年轻人都向往的城市,有挑战,更有机会,从数据上看深圳的...
农林致富好项目有哪些 这四个农... 农林致富好项目有哪些?现在大家都有一个思想,尤其是在农村不少人都想自己创业赚钱,因为毕竟在农村创业优...
代理小本创业新开店项目 代理小...   创业开店项目小本创业项目推荐:纺吧,休闲娱乐的新时尚1在城市繁华居民区里或在游乐休闲集聚地租一套...
浙江福建等地积极应对台风“丹娜...   央视网消息(新闻联播):7月7日,中央气象台发布台风蓝色预警。浙江、福建等地加强防范,积极应对将...
怎么创业 怎么创业 怎么创业呢... 一无所有的人怎么创业?分类:创业故事|如何创业|Word文档下载一无所有的人怎么创业?创业,先从认识...
你们是怎么创业的? 你们是怎么... 女朋友在毕业后的第1年内因为忍受不了事业单位的不良风气决定离职。同年,我因为忍受不了所任职私企的不良...