Go練習問題4-02:エラーハンドリングを理解しよう

記事内に商品プロモーションを含む場合があります

Go言語の初心者向け問題4-02:エラーハンドリングを理解しよう

この問題を解くために必要な知識:
レベル1~3の知識メモリ管理の基本エラーハンドリングとカスタムエラーチャネルの選択タイムアウト処理パッケージinit関数ファイル操作エンコーディングとデコーディングテストの書き方ベンチマークテストドキュメントの生成

<<前の問題 問題集Top 次の問題>>

Go言語の文法「エラーハンドリング」とは





ここではエラーハンドリングの意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。

Go言語のエラーハンドリングは、他のプログラミング言語と比べて少し独特な方法を採用しています。

エラーを例外として扱うのではなく、返り値として処理することが一般的です。この記事では、Go言語のエラーハンドリングの基本について解説します。

基本的なエラーハンドリング (error 型)

Goでは、関数やメソッドがエラーを返す際にerror型を使用します。これは関数の戻り値としてエラーを返し、呼び出し元でエラーが発生したかどうかをチェックするというシンプルな仕組みです。

package main

import (
    "errors"
    "fmt"
)

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Result:", result)
}

この例では、divide関数が引数bがゼロの場合にエラーを返します。呼び出し元でこのエラーをチェックし、適切に処理しています。

Go練習問題4-2:除算プログラムを作成してエラー処理を体験しよう

エラーハンドリングの基本を学ぶために、2つの整数を使って除算を行うプログラムを作成しましょう。

ユーザーがゼロで除算を試みた場合に、適切なエラーメッセージを表示する処理を実装します。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • int型の2つの整数abを宣言し、aに10、bに0を代入すること。
  • 関数divideを作成し、2つの整数を引数に取り、bがゼロである場合はエラーを返すこと。
  • errors.Newを使用してエラーメッセージを作成し、ゼロによる除算を防ぐこと。
  • main関数でdivide関数を呼び出し、エラーハンドリングを行うこと。
  • エラーが発生した場合、エラーメッセージを表示すること。
  • エラーが発生しなかった場合、除算の結果を表示すること。
  • 結果を日本語で表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

エラー: ゼロによる除算は許可されていません

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.errorsパッケージとfmtパッケージのインポート
 1-1. errorsパッケージのインポート
 1-2. fmtパッケージのインポート

2.divide関数の定義
 2-1. 引数として2つの整数a, bを受け取り、int型とerror型の戻り値を持つ
 2-2. 第二引数bが0の場合、エラーを作成し返す
  2-2-1. エラーメッセージ「ゼロによる除算は許可されていません」を含むerrorオブジェクトを作成
  2-2-2. 戻り値として0とエラーを返す
 2-3. 除算が可能な場合、aをbで割った結果を返す

3.main関数の定義
 3-1. 2つの整数num1, num2を定義
  3-1-1. num1には10を代入
  3-1-2. num2には0を代入
 3-2. divide関数を呼び出し、エラーハンドリングを行う
  3-2-1. divide関数にnum1とnum2を渡し、その結果をresult, errに受け取る
  3-2-2. errがnilでない場合、エラーメッセージを表示し、returnで終了
 3-3. 正常に除算が行われた場合の処理
  3-3-1. fmt.Printlnを使用して結果を表示

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

package main

import (
    "errors"
    "fmt"
)

// divide 関数は、2つの整数の除算を行います。
// 第二引数が0の場合はエラーを返します。
func divide(a, b int) (int, error) {
    if b == 0 {
        /*【穴埋め問題1】
        ここにゼロによる除算を禁止するためのエラー処理を行うコードを書いてください。
        */
    }
    return a / b, nil
}

func main() {
    // 二つの整数を定義します
    num1 := 10
    num2 := 0

    // divide関数を呼び出し、エラーハンドリングを行います
    result, err := divide(num1, num2)
    if err != nil {
        /*【穴埋め問題2】
        ここにエラーが発生した場合にエラーメッセージを表示し、処理を終了するコードを書いてください。
        */
    }

    // 正常に除算が行われた場合の処理
    fmt.Println("結果:", result)
}

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

package main

import (
    "errors"
    "fmt"
)

// divide 関数は、2つの整数の除算を行います。
// 第二引数が0の場合はエラーを返します。
func divide(a, b int) (int, error) {
    if b == 0 {
        // エラーハンドリングの一例として、エラーを作成し、返します
        return 0, errors.New("ゼロによる除算は許可されていません")
    }
    return a / b, nil
}

func main() {
    // 二つの整数を定義します
    num1 := 10
    num2 := 0

    // divide関数を呼び出し、エラーハンドリングを行います
    result, err := divide(num1, num2)
    if err != nil {
        // エラーが発生した場合の処理
        fmt.Println("エラー:", err)
        return
    }

    // 正常に除算が行われた場合の処理
    fmt.Println("結果:", result)
}

正解コードの解説

このコードは、2つの整数を除算する簡単なプログラムですが、エラーハンドリングの使用方法について特に着目して解説しています。

パッケージのインポート

import (
    "errors"
    "fmt"
)

最初に、Go標準ライブラリのerrorsfmtパッケージをインポートします。errorsパッケージは、エラーを作成するために使用します。

fmtパッケージは、フォーマットされた入出力(例:コンソールへのメッセージ表示)を行うために使用します。

divide 関数の定義

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("ゼロによる除算は許可されていません")
    }
    return a / b, nil
}

divide 関数は、2つの整数 ab を受け取り、その除算結果を返します。しかし、b がゼロの場合はエラーが発生します。

このような場合にエラーを返すために errors.New 関数を使用します。この関数は、指定したエラーメッセージを持つ新しいエラーオブジェクトを作成します。

エラーハンドリング

ここで特に重要なのは、エラーハンドリングです。Goでは、関数が複数の戻り値を返すことができるため、エラーを戻り値の一つとして返すことが一般的です。

この場合、ゼロによる除算が行われると、"ゼロによる除算は許可されていません"というカスタムエラーメッセージが返され、プログラムの動作を制御することができます。

main 関数の定義

func main() {
    num1 := 10
    num2 := 0

    result, err := divide(num1, num2)
    if err != nil {
        fmt.Println("エラー:", err)
        return
    }

    fmt.Println("結果:", result)
}

main 関数はプログラムのエントリーポイントです。ここで、2つの整数 num1num2 を定義し、divide 関数を使って除算を行います。

エラーハンドリングの実装

この部分では、divide 関数の戻り値としてエラーが返された場合(err != nil)、そのエラーをコンソールに表示し、プログラムを終了します。

エラーがない場合は、除算結果を表示します。これにより、ユーザーに何が問題だったのかを分かりやすく伝えることができます。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Go練習問題集へ戻る
    トップページへ戻る