カテゴリ: Go言語 更新日: 2025/12/29

Go言語のエラーハンドリングの基本!error型を理解しよう

Go言語のエラーハンドリングの基本!error型を理解しよう
Go言語のエラーハンドリングの基本!error型を理解しよう

先生と生徒の会話形式で理解しよう

生徒

「先生、Go言語でプログラムを書くときにエラーが出たらどうすればいいんですか?何か特別な決まりとかありますか?」

先生

「Go言語ではエラーハンドリング、つまりエラー処理がとても大事です。Goの特徴として、error型という特別な型を使ってエラーを扱います。」

生徒

「error型って何ですか?難しそうですね…」

先生

「安心してください。error型はエラーが起きたかどうかを教えてくれるメッセージのようなものです。今日はこのerror型の基本と、エラーをどう扱うかをゆっくり解説しますね。」

1. エラーハンドリングとは?

1. エラーハンドリングとは?
1. エラーハンドリングとは?

エラーハンドリングは、プログラムで「想定外」や「失敗」が起きたときに安全に対処するための決まりごとです。ファイルが見つからない、ネットワークが切れた、入力が不正だった――こうした外部要因は避けられません。そこで、失敗を検知し、知らせ、必要ならやさしく中断したり代替案に切り替えるのがエラーハンドリングの役目です。

ポイントは「止めるべきときに止め、続けられるなら続ける」こと。ユーザーへのメッセージ、ログへの記録、後続処理のスキップなどを通じて、データ破損や予期せぬクラッシュを避けます。Go言語でも、この考え方は同じです。

まずは雰囲気をつかむミニサンプル(初心者向け)


package main

import (
    "fmt"
    "os"
)

func main() {
    // わざと存在しないファイル名を開こうとする
    f, err := os.Open("data.txt")
    if err != nil {
        // 失敗を検知:ユーザーに分かる言葉で知らせて、処理をやめる
        fmt.Println("ファイルを開けませんでした。名前や場所を確認してください。")
        return
    }
    // ここに来られたら成功。後片付けを忘れない
    defer f.Close()

    fmt.Println("ファイルを開けたので、ここから先の処理を続けます。")
}

解説:os.Openで処理を試す → ②失敗したらメッセージを出して終了 → ③成功したら次の処理へ進む。このように「失敗したらどうするか」を先に決めておくと、プログラムは安定します。

この段階では「問題が起きるかもしれない前提で、まず確かめる」習慣を身につけましょう。次の章では、Go言語で広く使われるerrorという仕組みを使って、より具体的に失敗を扱う方法を見ていきます。

2. Go言語のerror型とは?

2. Go言語のerror型とは?
2. Go言語のerror型とは?

Go言語ではエラーを表すためにerror型というものを使います。これはエラーが起きたときに「エラーメッセージ」を持つことができる特別な型です。実際にはインターフェースの一種ですが、初心者の方は「エラーを伝える文字の箱」とイメージするとわかりやすいです。

エラーがなければ、error型の値は nil (何もない状態)になります。

3. error型を使った基本的なエラー処理の書き方

3. error型を使った基本的なエラー処理の書き方
3. error型を使った基本的なエラー処理の書き方

Goでは関数が処理結果と一緒にerrorを返すことが多いです。エラーが起きているかどうかを確認して、起きていたら適切に処理します。


package main

import (
    "errors"
    "fmt"
)

// エラーを返す関数の例
func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("0で割ることはできません")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0) // 0で割ろうとしている
    if err != nil {
        fmt.Println("エラー:", err)
        return
    }
    fmt.Println("結果:", result)
}

このコードでは、divide関数が割り算の結果とエラーを返しています。割る数が0の場合はエラーを返し、それ以外は計算結果を返します。main関数でエラーがないかチェックし、あればエラーメッセージを表示します。

4. nilとは?

4. nilとは?
4. nilとは?

nilは「何もない」ことを示す特別な値です。error型の場合はエラーがない状態を表します。なので、if err != nilという条件は「エラーがあるかどうか」を調べています。

5. よくあるエラーハンドリングのパターン

5. よくあるエラーハンドリングのパターン
5. よくあるエラーハンドリングのパターン

多くのGoプログラムでは、関数がエラーを返したらすぐに処理をやめるか、エラー内容をログに書いて次の処理を考えます。基本は以下の流れです。

  • 関数がerrorを返す
  • 戻り値のerrorをチェックする
  • エラーなら処理を中断したり、ログを出したりする
  • エラーがなければ正常な処理を続ける

このパターンを守ることで、予期しない問題に強いプログラムが作れます。

6. エラーの作り方とカスタマイズ

6. エラーの作り方とカスタマイズ
6. エラーの作り方とカスタマイズ

先ほどの例では errors.New で簡単にエラーを作りましたが、より詳しい情報を含んだエラーを自分で作ることもできます。


package main

import (
    "fmt"
)

// 独自のエラー型を作る
type MyError struct {
    Msg string
}

func (e *MyError) Error() string {
    return e.Msg
}

func doSomething(flag bool) error {
    if !flag {
        return &MyError{Msg: "処理に失敗しました"}
    }
    return nil
}

func main() {
    err := doSomething(false)
    if err != nil {
        fmt.Println("エラー発生:", err)
    }
}

このように自分だけのエラー情報を持った型を作ることもでき、状況に応じて細かいエラーの扱いができます。

7. まとめないですが重要なポイント

7. まとめないですが重要なポイント
7. まとめないですが重要なポイント
  • Goのエラーはerror型で表現される
  • 関数の戻り値でエラーを返すのが基本のやり方
  • nilでないエラーは必ずチェックして対応する
  • エラーを作るときはerrors.Newや独自の型を使える
  • エラーハンドリングはプログラムの安定性を高める重要な技術

8. エラーを怖がらず使いこなそう

8. エラーを怖がらず使いこなそう
8. エラーを怖がらず使いこなそう

エラー処理は初心者には難しいと思われがちですが、Go言語のerror型はシンプルで扱いやすい仕組みです。まずはエラーを返す関数を呼び出して、エラーの有無をチェックする基本をしっかり身につけましょう。慣れてくると、より安全で安心できるプログラムが書けるようになりますよ。

まとめ

まとめ
まとめ

Go言語のエラーハンドリングは、初心者でも理解しやすい構文でありながら、実際の開発現場でも非常に重要な仕組みです。プログラムが正常に動く状況だけではなく、予期しない問題が起きたときに落ち着いて対応できるかどうかが、安定したアプリケーションを作る大切なポイントになります。特に、ファイル操作やネットワーク通信、データベースの処理など、外部と関わる処理ではエラーが発生しやすく、Go言語のerror型が本領を発揮します。エラーが返ってきたときにnilと比較する書き方は最初は独特に見えるかもしれませんが、慣れてしまえば自然に書けるようになります。

また、Go言語には独自のエラー型を定義できる柔軟さがあり、エラーの内容をより詳しく伝えたい場面にも対応できます。独自エラー型を使えば、「どこで失敗したのか」「どんな原因で処理が止まったのか」といった情報を細かく持たせられるため、ログ管理やデバッグにも役立ちます。WebアプリケーションやAPIを作るときには、ユーザーに返すメッセージを整理したり、内部処理ログを分かりやすく管理したりと、エラー処理は運用面でも欠かせない存在です。

さらに、Go言語ではエラーが発生した時点で処理をやめるだけではなく、条件に応じて別の処理へ流したり、エラー内容を画面表示したり、ログファイルに保存したりと柔軟な動きができます。つまり、エラーを正しく扱えば、壊れにくいプログラム、予測可能なプログラム、信頼できるプログラムに近づいていきます。現場では、複数の関数が連続して呼ばれるとき、それぞれでerrorチェックが行われ、途中で問題があれば無理に続けず安全に停止させます。この積み重ねが、後から見ても読みやすく、修正しやすいコードを生み出します。

そして最後に、エラーハンドリングは「つい書き忘れてしまう」「動いているから大丈夫」と考えがちな部分ですが、しっかり理解すれば必ず役に立ちます。エラーのないプログラムは存在しません。だからこそ、エラーと向き合い、処理を工夫し、アプリケーションを守ることが大切です。Go言語は簡潔な文法でありながら、エラーを扱う機能がとても強力ですので、少しずつコードを書きながら身につけていきましょう。

サンプルプログラムでもう一度復習

ここでは、ファイルを開く処理でエラーが出た場合にどうするか、簡単なコードで振り返ります。


// ファイルを開くサンプル
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("data.txt")
    if err != nil {
        fmt.Println("ファイルを開けませんでした:", err)
        return
    }
    defer file.Close()
    fmt.Println("ファイルを正常に開くことができました")
}

この例では、ファイルが存在しなかったり、権限の問題で開けなかったりする場合にerrに値が入ります。もしnilでなければ、エラーメッセージを表示して終了します。逆に正常に開けた場合はdefer file.Close()でファイルを閉じつつ処理が進みます。こうした丁寧なエラー処理が積み重なることで、安全で動作の安定したアプリケーションになります。

プログラムは常に理想通り動くわけではなく、思わぬデータや入力ミス、外部環境の変化によってエラーを出すことがあります。そうしたときに必要なのがエラーハンドリングです。「とりあえず動けばいい」ではなく、「問題が起きても落ち着いて処理する」姿勢を持つことで、開発者としてのスキルも大きく成長します。ぜひ、エラーを見るたびに落ち込むのではなく、次の改善ポイントが見つかったと前向きにとらえてみてください。

先生と生徒の振り返り会話

生徒

「先生、エラーってできれば出したくないって思っていましたけど、ちゃんと向き合うことが大事なんですね。」

先生

「その通りです。エラーは悪者ではなく、プログラムの問題を教えてくれる大切な味方ですよ。」

生徒

nilerrの比較も最初は不思議でしたけど、慣れると分かりやすいですね。」

先生

「エラー型を自分で作れるのも便利ですよ。システムが大きくなるほど、細かい情報が役に立ちます。」

生徒

「これからエラーが出ても、落ち着いて原因を見るようにします!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Go言語でエラーハンドリングは何のために必要なのですか?普通に動いていれば気にしなくてもいいのですか?

Go言語でエラーハンドリングが必要なのは、プログラムがいつも理想通りに動くとは限らないからです。ファイルが存在しない、ネットワーク通信が切れる、ユーザーの入力が間違っているなど、様々な理由でエラーは必ず発生します。エラーハンドリングを使うことでプログラムを途中で止めず、安全に処理を続けたり、ユーザーに丁寧な説明をしたりできます。Go言語のerror型はとてもシンプルで初心者でも扱いやすく、安定したシステムを作るために重要な仕組みです。
関連記事:
カテゴリの一覧へ
新着記事
New1
Kotlin
Kotlinの構文ルールまとめ!インデント・セミコロンなど初心者が最初に覚えるべきポイント
New2
Kotlin
Kotlinの関数ドキュメンテーションコメント(KDoc)の書き方を徹底解説!初心者でもわかる丁寧なガイド
New3
Kotlin
KotlinでHello Worldを表示するには?最初の1行を実行してみよう
New4
Go言語
Go言語の依存関係管理を始めよう!go modの基本設定と導入手順
人気記事
No.1
Java&Spring記事人気No1
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.2
Java&Spring記事人気No2
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
No.3
Java&Spring記事人気No3
Kotlin
KotlinのAPI通信でGETリクエストを送る方法!初心者向け徹底ガイド
No.4
Java&Spring記事人気No4
Swift
SwiftのURLSessionでのネットワークエラー対策!再試行とタイムアウトを初心者向けに解説
No.5
Java&Spring記事人気No5
Go言語
Go言語のテストでタイムアウト・並行処理を扱うポイント
No.6
Java&Spring記事人気No6
Go言語
Go言語のWebアプリにおけるセキュリティベストプラクティス集
No.7
Java&Spring記事人気No7
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.8
Java&Spring記事人気No8
Swift
Swift JSONデコード失敗の原因と対処|DecodingError徹底解説