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 }
エラーを処理する各行には、さらに 3 行のコードが追加されます。これらのエラーの多くは致命的ではないか、別の場所で処理されるため、ボイラープレートの増加につながります。
慣用的なエラー処理
慣用的なアプローチの 1 つは、関数からエラーを返し、呼び出しコードで明示的に処理します。
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 中国語 Web サイトの他の関連記事を参照してください。