首页 > 后端开发 > Golang > 如何高效处理Go中的多个错误?

如何高效处理Go中的多个错误?

Patricia Arquette
发布: 2024-11-30 07:22:11
原创
674 人浏览过

How Can I Efficiently Handle Multiple Errors in Go?

在 Go 中处理多个错误

Go 中的错误处理强调在错误发生时对错误进行显式检查。但是,在处理单个块中的多个错误时,这可能会导致冗长的代码。

考虑这个人为的示例:

package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "os/exec"
)

func main() {
    cmd := exec.Command("cat", "-")
    stdin, err := cmd.StdinPipe()
    if err != nil {
        return
    }
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        return
    }
    err = cmd.Start()
    if err != nil {
        return
    }
    _, err = io.WriteString(stdin, "Hello world!")
    if err != nil {
        return
    }
    err = stdin.Close()
    if err != nil {
        return
    }
    output, err := ioutil.ReadAll(stdout)
    if err != nil {
        return
    }
    fmt.Println(string(output))
    return
}
登录后复制

每行处理错误都会添加三行额外的代码。其中许多错误不是致命的,也不是在其他地方处理的,从而导致样板代码明显增加。

惯用的错误处理

一种惯用的方法是从函数返回错误,在调用代码中显式处理它们。

package main

import (
    "fmt"
    "os"

    "errors"
)

func piping(input string) (string, error) {
    cmd := exec.Command("cat", "-")
    stdin, err := cmd.StdinPipe()
    if err != nil {
        return "", err
    }
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        return "", err
    }
    if err = cmd.Start(); err != nil {
        return "", err
    }
    if _, err = io.WriteString(stdin, input); err != nil {
        return "", err
    }
    if err = stdin.Close(); err != nil {
        return "", err
    }
    all, err := ioutil.ReadAll(stdout)
    if err != nil {
        return "", err
    }
    return string(all), nil
}

func main() {
    in := "Hello world!"
    fmt.Println(in)
    out, err := piping(in)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(out)
}
登录后复制

在此示例中,piping() 返回输出和遇到的任何错误。然后,调用代码可以处理错误或在必要时传播错误。

Go 中的错误处理

在 Go 中,显式错误处理至关重要。显式的 if err != nil 检查鼓励程序员立即处理错误,避免可能导致意外程序行为的未处理错误。

虽然这种方法在某些情况下可能会导致冗长的代码,但它促进了一种规范的方法错误处理和可维护性。

以上是如何高效处理Go中的多个错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板