エラーの概念
CoddyのGOジャーニー「基礎」セクションの一部 — レッスン 102/109。
Goでは、エラーは何かがうまくいかなかったことを示す値です。Goは例外を使用するのではなく、明示的にエラーを処理します。
数値を割る際にエラーが発生する可能性のある関数を作成してみましょう:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}この関数は、除算の結果と潜在的なエラーの2つの値を返します。除数がゼロの場合、除算を試みる代わりにエラーメッセージを返します。
それでは、関数を使用して、発生する可能性のあるエラーを処理してみましょう。
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}このコードを実行すると、ゼロ除算を試みたため、画面にエラーメッセージが表示されます:
Error: cannot divide by zeroこれはGoのエラーハンドリングパターンを示しています。エラーが発生したかどうかを確認し(err != nil)、適切な処理を行います。エラーが発生しなかった場合は、安全に結果を使用できます。
チャレンジ
簡単このチャレンジでは、Goにおけるエラーの扱いを練習します。2つの数値を除算し、ゼロ除算が試みられた場合にエラーを返す関数を作成します。
あなたのタスクは以下の通りです:
- 2つの整数を受け取り、その商とエラーを返す
divide関数を完成させてください。 - 除数がゼロの場合、0と "division by zero" というメッセージを持つエラーを返してください。
- 除算が有効な場合は、結果とエラーとして
nilを返してください。 main関数内で、提供された値を使用してdivideを呼び出し、エラーを適切に処理してください。
この演習では、Goの関数が一般的に結果とエラーを返す方法、およびそれらのエラーをチェックして処理する方法を示します。
チートシート
Goでは、エラーは何か問題が発生したことを示す値です。Goは例外を使用するのではなく、明示的にエラーを処理します。
失敗する可能性のある関数は、結果と潜在的なエラーの2つの値を返します:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}エラーを処理するには、エラーが nil でないかどうかを確認します:
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}新しいエラーメッセージを作成するには errors.New() を使用し、エラーが発生しなかった場合は nil を返します。
自分で試してみよう
package main
import (
"errors"
"fmt"
)
// divide は a を b で割り、その結果を返します
// もし b が 0 の場合は、エラーを返します
func divide(a, b int) (int, error) {
// TODO: divide 関数を実装してください
// もし b が 0 の場合は、0 と "division by zero" というメッセージを持つエラーを返してください
// それ以外の場合は、a/b とエラーとして nil を返してください
}
func main() {
// 最初のテストケース
a, b := 10, 2
result, err := divide(a, b)
if err != nil {
fmt.Printf("Error: %s\n", err)
} else {
fmt.Printf("Result: %d\n", result)
}
// 2番目のテストケース
a, b = 8, 0
result, err = divide(a, b)
if err != nil {
fmt.Printf("Error: %s\n", err)
} else {
fmt.Printf("Result: %d\n", result)
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
11複合型:スライス
スライス入門スライスリテラルの宣言`make` によるスライスの作成スライスの長さと容量スライス要素へのアクセス要素の追加既存のスライス/配列のスライススライスの反復処理スライスのコピーまとめ:動的リスト14エラーハンドリングの基本
エラーの概念`error` インターフェースエラーを返す関数エラーのチェックシンプルなエラーの作成フォーマット済みエラーの作成基本的なエラーハンドリングまとめ:問題への対処