本文へスキップ
BecomeCoder

Goコース · 第4章 関数とエラー処理 · レッスン15

エラー処理 ― error を返す

ブラウザで完結

導入

Go には他言語のような try/catch(例外)がありません。代わりに、関数が最後の戻り値として error を返し、呼び出し側がその場で確認します。「失敗するかもしれない処理は、失敗を値で返す」という考え方です。

説明

package main

import (
    "errors"
    "fmt"
)

// 0 で割ろうとしたらエラーを返す
func safeDivide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("0 では割れません")
    }
    return a / b, nil
}

func main() {
    result, err := safeDivide(10, 0)
    if err != nil {
        fmt.Println("エラー:", err)
        return
    }
    fmt.Println("結果:", result)
}
  • 関数は (int, error) のように「結果」と「エラー」を返します。
  • 成功したときはエラー欄に nil(ニル、=「何も無い」)を返します。
  • 呼び出し側は必ず if err != nil { ... } でエラーを確認するのがお約束です。

この if err != nil はGoのコードで最も頻繁に登場する定型句です。少し冗長に見えますが、「どこで失敗しうるか」がコードを読むだけで分かる、という利点があります。

やってみよう

safeDivide(10, 0)safeDivide(10, 2) に変えると、errnil になり「結果: 5」が表示されます。「エラーが nil かどうかを必ず確認する」流れを、成功・失敗の両方でたどってみましょう。

実際に動かしてみよう

下のエディタにGoを書いて「実行」を押すと、学習用シミュレータが fmt の出力を表示します(本物のGoコンパイラではなく、教材の範囲を再現した軽量エンジンです)。スライス・マップ・構造体・インターフェース・goroutine/channel なども動きます。本文の例を書き換えて動かしてみましょう(並行処理の実行順は決定的に再現しているため、本物のインターリーブとは異なる場合があります)。

Go — ブラウザ内で実行(学習用シミュレータ)

Goの教材サブセットを動かす学習用シミュレータを読み込みます(本物のGoコンパイラではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。