有没有一种方法可以找到 Go 代码中未处理的错误?

4
假设我们有以下的代码:
func main() {
    doStuff()
}

听起来不错,直到你的程序没有任何错误运行,但什么也没做,因为你忘记了 doStuff() 实际上长成这样:

func doStuff() error {
    // ...
    return errors.New("woops!")
}

我们需要做的是:
func main() {
    err := doStuff()
    if err != nil {
        panic(err)
    }
}

或者至少(为了更明显):

func main() {
    _ = doStuff()
}

有很多Go语言工具,比如。有没有一种简单的方法来检查我的代码是否处理了错误返回值?


4
你尝试过使用errcheck吗?它可以在这个链接上找到:https://github.com/kisielk/errcheck。 - eugecm
你说你知道有很多工具可以对Go代码进行静态代码检查,但没有说明为什么你已经知道的任何一个工具都是一个合适的解决方案...你是否正在寻找尚未找到的特定内容? - Adrian
1个回答

4

正如 @eugecm 建议的那样,github.com/kisielk/errcheck 可以实现此功能,github.com/GoASTScanner/gas 也可以。此外,github.com/alecthomas/gometalinter 可以轻松地下载一组代码检查工具并并行运行它们,其中包括前面提到的两个工具。

因此,

go get github.com/alecthomas/gometalinter
gometalinter --install
gometalinter

您可以下载gometalinter,它会安装多个错误和风格检查器,并并行运行它们,报告结果。

您示例的相关结果将如下:

main.go:13::warning: Errors unhandled.,LOW,HIGH (gas)
main.go:13::warning: error return value not checked (doStuff()) (errcheck)

我推荐使用gometalinter,因为它会提供类似于上面的结果,而在裸命令上运行errcheck只会显示main.go:13:10 doStuff()(因为errcheck是一个程序,检查未经检查的错误返回值,所以没有额外的信息是真正必要的)。

2
https://github.com/alecthomas/gometalinter 已被 https://github.com/golangci/golangci-lint 取代。 - Farshid T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接