I'm new to go and finding the error handling to be extremely verbose. I've read the reasoning for it and mostly agree, but there are a few places where it seems like there's more code to handle errors than actually do the work. Here is a (contrived) example, where I pipe "Hello world!" into cat and read and print the output. Basically every line has three more to handle the error, and I'm not really even handling anything.
package main
import "fmt"
import "io"
import "io/ioutil"
import "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
}
Is there an idiomatic, clean way to handle this? I just feel like I'm missing something.
Clearly, we must handle any errors; we can't just ignore them.
For example, trying to make the example less artificial,
package main
import (
"fmt"
"io"
"io/ioutil"
"os"
"os/exec"
)
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
}
err = cmd.Start()
if err != nil {
return "", err
}
_, err = io.WriteString(stdin, input)
if err != nil {
return "", err
}
err = stdin.Close()
if err != nil {
return "", err
}
all, err := ioutil.ReadAll(stdout)
output := string(all)
if err != nil {
return output, err
}
return output, 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)
}
Output:
Hello world!
Hello world!
Error Handling and Go
In Go, error handling is important. The language's design and conventions encourage you to explicitly check for errors where they occur (as distinct from the convention in other languages of throwing exceptions and sometimes catching them). In some cases this makes Go code verbose.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With