カテゴリ: Go言語 更新日: 2026/02/07

Go言語のカスタムエラー(独自エラー型)の作り方と使い方を初心者向けに解説!エラーハンドリングの基本

Go言語のカスタムエラー(独自エラー型)の作り方と使い方
Go言語のカスタムエラー(独自エラー型)の作り方と使い方

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

生徒

「先生、Go言語で自分だけのエラーを作ることってできますか?例えば、特別なエラーを作って処理を分けたいです。」

先生

「はい、できます。Go言語ではカスタムエラーと呼ばれる独自のエラー型を作ることができます。これでエラーの内容をより詳しく表現できるんですよ。」

生徒

「カスタムエラーって難しそうです。どうやって作るんですか?」

先生

「簡単ですよ。基本は『構造体(struct)』というデータの型を作って、それにエラー情報を書き、Error()というメソッドを実装するだけです。実際のコードを見ながら説明しましょう!」

1. カスタムエラー(独自エラー型)とは?

1. カスタムエラー(独自エラー型)とは?
1. カスタムエラー(独自エラー型)とは?

Go言語のカスタムエラーとは、ただ「失敗しました」と伝えるだけでなく、どんな状況でエラーが起きたのかを細かく記録できる仕組みのことです。通常のエラーは文字列だけのシンプルな情報ですが、カスタムエラーなら「エラーの種類」「どの処理で発生したか」「追加の説明」など、よりわかりやすく整理された情報を持たせられます。

例えば、買い物アプリを作る場合、「在庫が足りないエラー」や「ログインに失敗したエラー」など、状況に応じたエラーを用意しておくと、後から原因を調べるときにも役立ちます。初心者でも、こうしたカスタムエラーを使うことでエラーメッセージの管理がしやすくなり、プログラムの見通しが良くなります。

とても簡単な例として、「入力された年齢が不正なときに発生するエラー」を考えてみましょう。


// 年齢が正しくないことを表すカスタムエラー
type AgeError struct {
    Message string
}

func (e *AgeError) Error() string {
    return e.Message
}

func checkAge(age int) error {
    if age < 0 {
        return &AgeError{Message: "年齢はマイナスにできません"}
    }
    return nil
}

このように、カスタムエラーを使うと「どうしてエラーなのか」をプログラムの中で自然に表現できるようになります。難しい仕組みに見えますが、まずは身近な例から試してみると理解が深まりますよ。

2. Go言語でカスタムエラーを作るための基本ルール

2. Go言語でカスタムエラーを作るための基本ルール
2. Go言語でカスタムエラーを作るための基本ルール

Go言語でカスタムエラーを作る際の前提となるのが、errorというインターフェースです。インターフェースと聞くと難しく感じるかもしれませんが、「こういう形で動くものならエラーとして扱えますよ」という“決まり事”だと思えば大丈夫です。このerrorインターフェースはただひとつ、Error() stringというメソッドを持つことだけが条件になっています。

つまり、どんな型でも、このメソッドを実装すればエラーとして扱えるようになります。構造体にメッセージを持たせ、その内容をError()で返すだけで、自分専用のエラーが完成します。初めて触れる方も「必要最低限のルールだけで作れる」と感じると思います。

例として、とても単純な「名前が空だったときのエラー」を作ってみましょう。


// 名前が空だった場合のカスタムエラー
type NameError struct {
    Message string
}

func (e *NameError) Error() string {
    return e.Message
}

func checkName(name string) error {
    if name == "" {
        return &NameError{Message: "名前が入力されていません"}
    }
    return nil
}

このように、たった数行の構造でエラーを自分のアプリ専用にカスタマイズできます。複雑な仕組みを覚えるよりも、まずは「Errorメソッドを書けばカスタムエラーになる」という感覚をつかむことが大切です。

3. カスタムエラーの作り方:構造体とErrorメソッド

3. カスタムエラーの作り方:構造体とErrorメソッド
3. カスタムエラーの作り方:構造体とErrorメソッド

以下の例で、簡単なカスタムエラーを作ってみましょう。


package main

import "fmt"

// CustomErrorという名前の構造体を作る
type CustomError struct {
    Code    int    // エラーコードを表す数字
    Message string // エラーメッセージの文字列
}

// Errorメソッドを定義して、errorインターフェースを実装
func (e *CustomError) Error() string {
    return fmt.Sprintf("エラーコード %d: %s", e.Code, e.Message)
}

func doSomething(flag bool) error {
    if !flag {
        // カスタムエラーを返す
        return &CustomError{
            Code:    404,
            Message: "データが見つかりません",
        }
    }
    return nil
}

func main() {
    err := doSomething(false)
    if err != nil {
        fmt.Println("エラー発生:", err)
    } else {
        fmt.Println("正常に処理が完了しました")
    }
}

この例では、CustomError構造体を作り、エラーコードとメッセージを持たせています。Error()メソッドではエラーメッセージを整形して返しています。

Go言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

4. カスタムエラーを使うメリット

4. カスタムエラーを使うメリット
4. カスタムエラーを使うメリット

カスタムエラーを使うと、エラーの種類ごとに分けて処理できます。例えばエラーコードを調べて、ユーザーに違うメッセージを出したり、特定の処理を実行したりできます。単純な文字列だけのエラーより、扱いやすくなります。

5. カスタムエラーの判定方法

5. カスタムエラーの判定方法
5. カスタムエラーの判定方法

カスタムエラーかどうかを調べたいときは、Go言語の errors.As 関数を使うのが便利です。以下はその例です。


package main

import (
    "errors"
    "fmt"
)

type CustomError struct {
    Code    int
    Message string
}

func (e *CustomError) Error() string {
    return fmt.Sprintf("エラーコード %d: %s", e.Code, e.Message)
}

func doSomething(flag bool) error {
    if !flag {
        return &CustomError{Code: 401, Message: "認証に失敗しました"}
    }
    return nil
}

func main() {
    err := doSomething(false)
    if err != nil {
        var customErr *CustomError
        if errors.As(err, &customErr) {
            fmt.Printf("カスタムエラーです。コード: %d, メッセージ: %s\n", customErr.Code, customErr.Message)
        } else {
            fmt.Println("通常のエラーです:", err)
        }
    } else {
        fmt.Println("正常に処理が完了しました")
    }
}

errors.Asは、エラーが特定の型かどうかを調べ、その型に変換(キャスト)してくれます。これでエラーの詳細情報を取得できます。

6. カスタムエラーを実践で活かすためのポイント

6. カスタムエラーを実践で活かすためのポイント
6. カスタムエラーを実践で活かすためのポイント

Go言語でカスタムエラー(独自エラー型)を作るには、構造体を定義し、Error()メソッドを実装すれば簡単にできます。カスタムエラーを使うことでエラー情報を豊かにでき、トラブルシューティングやユーザーへの案内がよりわかりやすくなります。

また、errors.Asを使ってカスタムエラーかどうか判定し、適切な処理を分けることも重要です。初心者でもこの基本を押さえれば、Go言語のエラーハンドリングがぐっとレベルアップしますよ。

まとめ

まとめ
まとめ

ここまで、Go言語でカスタムエラー(独自エラー型)を作る方法や、どんな場面で役に立つのかを丁寧に確認してきました。あらためて振り返ってみると、カスタムエラーは単なる「失敗しました」という通知以上の働きをしてくれる心強い仕組みだということがよくわかります。実際の開発でも、特定の状況ごとに意味のあるエラーを返せると、あとから振り返ったときに「どこで何が起きたのか」をすぐに判断しやすくなりますし、ユーザーにわかりやすく案内する文章も自然と書けるようになります。

そして、カスタムエラーを作る基本は構造体とメソッドという非常にシンプルな仕組みだけで成り立っています。この「必要な要素だけで柔軟なエラーを作れる」という点が、Go言語の扱いやすさにつながっているとも言えます。はじめてプログラミングに触れる人でも、決して難しく感じる必要はありません。何度か構造体を書いてみて、Error()メソッドの役割に慣れてくれば、自分のアプリケーションに必要なエラーを自由に設計できるようになります。

また、エラーそのものを判定する仕組みとして errors.As が活躍します。これは「渡されたエラーが特定の型なのかどうか」を調べる便利な機能で、たとえば複数のエラーが同じ関数から返る場合や、カスタムエラーと通常のエラーを使い分けたいときにとても役立ちます。エラーを適切に判定し、状況に応じたメッセージを表示することは、プログラムの品質を大きく左右する部分です。

ここで、今回学んだ内容をまとめつつ、シンプルな応用例も見ておきましょう。実際に書いてみると、カスタムエラーの動きがさらに理解しやすくなります。

カスタムエラーを活用した簡単なサンプル


package main

import (
    "errors"
    "fmt"
)

// ネットワーク接続に失敗したことを表すカスタムエラー
type NetworkError struct {
    URL     string
    Message string
}

func (e *NetworkError) Error() string {
    return fmt.Sprintf("アクセス失敗: %s (%s)", e.URL, e.Message)
}

func connect(url string, ok bool) error {
    if !ok {
        return &NetworkError{
            URL:     url,
            Message: "サーバーに到達できませんでした",
        }
    }
    return nil
}

func main() {
    err := connect("https://example.com", false)
    if err != nil {
        var netErr *NetworkError
        if errors.As(err, &netErr) {
            fmt.Println("ネットワークエラーです:", netErr)
        } else {
            fmt.Println("その他のエラー:", err)
        }
    } else {
        fmt.Println("接続に成功しました")
    }
}

このサンプルでは、ネットワーク接続の失敗をカスタムエラーとして表現しています。URL とメッセージを持たせているため、どこにアクセスしようとして何が起きたのかを明確に示せます。また、errors.As を使うことで「このエラーはネットワーク関連のものなのか」を簡単に調べることができます。こうした工夫は、規模が大きくなるプログラムほど効果を発揮し、あとからコードを読んだ人にも親切な設計になります。

エラーハンドリングは決して裏方だけの技術ではなく、アプリケーション全体の使いやすさや信頼性を支える大切な部分です。今回紹介したカスタムエラーの作り方と使い方は、Go言語を学ぶうえで必ず役に立つ土台になりますので、ぜひ自分のアプリや学習用コードにも取り入れて、理解を深めていってください。

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

生徒

「先生、カスタムエラーって思っていたよりシンプルなんですね。構造体を作って Error メソッドを書くだけなら、自分でも作れそうです!」

先生

「そうなんです。難しそうに見えても、実はとても直感的に使える仕組みなんですよ。大事なのは、どんな情報をエラーとして持たせたいかを考えることですね。」

生徒

「エラーを判定するときに errors.As を使うのも便利でした。種類の違うエラーをまとめて扱えるってすごく実用的です。」

先生

「その通りです。エラーの型で処理を分けるのは現場でもよくあることなので、覚えておくと必ず役に立ちますよ。」

生徒

「今日の内容で、Go言語のエラーハンドリングが少し楽しくなりました。次はもっと複雑なエラーにも挑戦してみたいです!」

先生

「それはいい心がけですね。まずは今日のカスタムエラーをいろいろな場面に使ってみて、少しずつ慣れていきましょう。」

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

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

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

Go言語でカスタムエラーを作るときに、構造体とErrorメソッドだけで本当にエラーとして扱えるのですか?

はい、扱えます。Go言語では「errorインターフェース」を満たしていればどんな型でもエラーとして扱えるため、構造体にErrorメソッドを実装するだけでカスタムエラーとして利用できます。構造体でエラーコードやメッセージを持たせることで、通常のエラーよりも詳しい情報を持つエラーハンドリングが可能になります。
関連記事:
カテゴリの一覧へ
新着記事
New1
Go言語
Go言語の短絡評価(ショートサーキット)を使った条件式の工夫をやさしく解説!初心者でも理解できる基本知識
New2
Go言語
Go言語の構造体の初期化パターンとコンストラクタ的関数の書き方を徹底解説!初心者でもわかる基本と実用例
New3
Kotlin
Kotlinの例外処理とキャンセルの連携を完全ガイド!初心者でもわかるCoroutineExceptionHandlerの使い方
New4
Go言語
Go言語のクロージャとは?関数内関数の活用例と仕組み
人気記事
No.1
Java&Spring記事人気No1
Kotlin
KotlinのChannelでデータをやり取りする方法を完全ガイド!初心者にもわかる非同期通信の基本
No.2
Java&Spring記事人気No2
Go言語
Go言語でのDB接続情報を環境変数で管理する方法|初心者でも安全に設定
No.3
Java&Spring記事人気No3
Kotlin
Kotlinのビルド設定エラーと解決法まとめ!初心者向けGradleトラブル対処ガイド
No.4
Java&Spring記事人気No4
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.5
Java&Spring記事人気No5
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.6
Java&Spring記事人気No6
Kotlin
Kotlinでテキスト表示・編集!初心者でもわかるTextViewとEditTextの使い方
No.7
Java&Spring記事人気No7
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.8
Java&Spring記事人気No8
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方

💻 作業効率アップに

ノートPCを縦置きしてデスクを広く。
省スペースで片づく定番スタンド

UGREEN 縦型スタンドをAmazonで見る

※ Amazon広告リンク