Menu
Coddy logo textTech

エラーの概念

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)、適切な処理を行います。エラーが発生しなかった場合は、安全に結果を使用できます。

challenge icon

チャレンジ

簡単

このチャレンジでは、Goにおけるエラーの扱いを練習します。2つの数値を除算し、ゼロ除算が試みられた場合にエラーを返す関数を作成します。

あなたのタスクは以下の通りです:

  1. 2つの整数を受け取り、その商とエラーを返す divide 関数を完成させてください。
  2. 除数がゼロの場合、0と "division by zero" というメッセージを持つエラーを返してください。
  3. 除算が有効な場合は、結果とエラーとして nil を返してください。
  4. 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)
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン