エラーを返し、処理する
エラー処理は、堅牢なコードの不可欠な機能です。このセクションでは、挨拶モジュールからエラーを返すためのコードを追加し、呼び出し側でそれを処理します。
- 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 }
このコードでは、
- 関数が2つの値(
string
とerror
)を返すように変更します。呼び出し側は2番目の値をチェックしてエラーが発生したかどうかを確認します。(任意のGo関数は複数の値を返すことができます。詳細については、Effective Goを参照してください。) - Go標準ライブラリの
errors
パッケージをインポートして、そのerrors.New
関数を使用できるようにします。 if
ステートメントを追加して、無効なリクエスト(名前が指定されるべき場所が空の文字列である)をチェックし、リクエストが無効な場合はエラーを返します。errors.New
関数は、メッセージが中に含まれるerror
を返します。- 成功した場合の戻り値として、2番目の値に
nil
(エラーがないことを意味する)を追加します。そうすることで、呼び出し側は関数が成功したことを確認できます。
- 関数が2つの値(
- 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: 」)を出力するように構成します。error
を含む、Hello
の2つの戻り値を両方とも変数に割り当てます。Hello
の引数をGladysの名前から空の文字列に変更して、エラー処理コードを試すことができるようにします。- nilでない
error
値を探します。この場合、処理を続行する意味はありません。 - 標準ライブラリの
log
パッケージの関数を使用してエラー情報を出力します。エラーが発生した場合、log
パッケージのFatal
関数を使用してエラーを出力し、プログラムを停止します。
hello
ディレクトリのコマンドラインで、hello.goを実行して、コードが動作することを確認します。空の名前を渡すようになったため、エラーが発生します。
$ go run . greetings: empty name exit status 1
これがGoの一般的なエラー処理です。エラーを値として返し、呼び出し側がそれをチェックできるようにします。
次に、Goのスライスを使用して、ランダムに選択された挨拶を返します。