在 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中文网其他相关文章!