エラーを返す、および処理する
エラー処理は堅牢なコードの不可欠な機能です。このセクションでは、greetings モジュールからエラーを返し、呼び出し元でそれを処理するためのコードを追加します。
- greetings/greetings.go に、以下でハイライトされているコードを追加します。
挨拶する相手がわからないのであれば、挨拶を返す意味がありません。名前が空の場合は、呼び出し元にエラーを返します。以下のコードを greetings.go にコピーしてファイルを保存します。
package greetings import ( "errors" "fmt" ) // Hello returns a greeting for the named person. func Hello(name string) (string, error) { // If no name was given, return an error with a message. if name == "" { return "", errors.New("empty name") } // If a name was received, return a value that embeds the name // in a greeting message. message := fmt.Sprintf("Hi, %v. Welcome!", name) return message, nil }このコードでは、以下のことを行います。
- 関数を、
stringとerrorの2つの値を返すように変更します。呼び出し元は2番目の値をチェックして、エラーが発生したかどうかを確認します。(任意の Go 関数は複数の値を返すことができます。詳細については、Effective Go を参照してください。) - Go 標準ライブラリの
errorsパッケージをインポートして、そのerrors.New関数 を使用できるようにします。 - 無効なリクエスト (名前に空の文字列がある場合) をチェックする
ifステートメントを追加し、リクエストが無効な場合はエラーを返します。errors.New関数は、メッセージを含むerrorを返します。 - 成功した戻り値の2番目の値として
nil(エラーなしを意味します) を追加します。これにより、呼び出し元は関数が成功したことを確認できます。
- 関数を、
- hello/hello.go ファイルで、
Hello関数によって返されるエラーと、非エラー値を処理します。以下のコードを hello.go に貼り付けます。
package main import ( "fmt" "log" "example.com/greetings" ) func main() { // Set properties of the predefined Logger, including // the log entry prefix and a flag to disable printing // the time, source file, and line number. log.SetPrefix("greetings: ") log.SetFlags(0) // Request a greeting message. message, err := greetings.Hello("") // If an error was returned, print it to the console and // exit the program. if err != nil { log.Fatal(err) } // If no error was returned, print the returned message // to the console. fmt.Println(message) }このコードでは、以下のことを行います。
logパッケージ を設定して、タイムスタンプやソースファイル情報なしで、ログメッセージの先頭にコマンド名 ("greetings: ") を出力するようにします。Helloの両方の戻り値 (errorを含む) を変数に代入します。- エラー処理コードを試すために、
Hello引数を Gladys の名前から空の文字列に変更します。 - 非 nil の
error値を探します。この場合、続行する意味はありません。 - 標準ライブラリの
log packageの関数を使用してエラー情報を出力します。エラーが発生した場合は、logパッケージのFatal関数 を使用してエラーを出力し、プログラムを停止します。
helloディレクトリのコマンドラインで hello.go を実行して、コードが機能することを確認します。空の名前を渡しているため、エラーが発生します。
$ go run . greetings: empty name exit status 1
これが Go の一般的なエラー処理です。エラーを値として返すことで、呼び出し元がそれをチェックできるようにします。
次に、Go のスライスを使用して、ランダムに選択された挨拶を返します。