登录
首页 >  Golang >  Go问答

如何检查errors.Errorf()中的类型错误?

来源:stackoverflow

时间:2024-04-10 14:54:32 269浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《如何检查errors.Errorf()中的类型错误?》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

调用 fmt.printf 等字符串格式化函数似乎是 go 编译器的一个弱点。我最终遇到了很多错误(重构后使用了错误的格式化程序,忘记包含所有参数),这些错误仅在运行时显现出来。所以每次我写其中一篇文章时,我最终都不得不用力眯着眼睛。

我今天做了一些研究,发现了 go 工具 vet,它似乎适用于 fmt.printf,但它不能捕获错误中的错误。errorf(见下文)。

import "github.com/pkg/errors"

func ReturnError(s string, i int) error {
    // Swap %d and %s, and forget to include the second argument
    return errors.Errorf("invalid arguments %d and %s", s)
}

是否有类似于 go 工具 vet 可以捕获errors.errorf() 中的字符串格式错误?另外,根据我自己的理解,为什么这是一个如此困难的问题?对于 go 编译器来说,捕获字符串格式类型错误似乎并不比任何其他类型的类型错误更困难。


解决方案


您可以告诉 go vet 要检查哪些函数(比较 godoc.org/cmd/vet):

$ cat x.go
package main

import "github.com/pkg/errors"

func ReturnError(s string, i int) error {
    // Swap %d and %s, and forget to include the second argument
    return errors.Errorf("invalid arguments %d and %s", s)
}
$ go vet x.go 
$ go vet -printfuncs Errorf x.go 
# command-line-arguments
./x.go:7: Errorf format %d has arg s of wrong type string

由于多种原因,要做得更好并不简单:

  • 格式字符串是运行时值:您可能会调用 fmt.sprintf(prefix + "%s", ...)。因此不可能在编译时捕获所有无效的格式字符串。
  • 格式字符串没有特殊类型。因此,编译器无法仅通过查看函数定义来轻松确定某些函数(在本例中为 errors.errorf)期望其参数的行为类似于 fmt.printf

理论要掌握,实操不能落!以上关于《如何检查errors.Errorf()中的类型错误?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>