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

Go言語のエラーハンドリングにおけるベストプラクティスまとめ!初心者でもわかる安心のエラー処理

Go言語のエラーハンドリングにおけるベストプラクティスまとめ
Go言語のエラーハンドリングにおけるベストプラクティスまとめ

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

生徒

「先生、Go言語でエラーが起きたとき、どうやって安全に処理したらいいですか?」

先生

「いい質問です。Go言語はエラーハンドリングをとても大切にしているので、正しいやり方を覚えることが重要です。今回は初心者にもわかりやすい、エラーハンドリングのベストプラクティスをまとめて教えますね。」

生徒

「お願いします!パソコンを触ったことがない僕でも理解できるようにお願いします!」

先生

「わかりました。では順番に解説します。」

1. Go言語のエラー処理の基本とは?

1. Go言語のエラー処理の基本とは?
1. Go言語のエラー処理の基本とは?

Go言語では、エラーは特別なerror型の値として扱われます。プログラムの関数は処理結果と一緒にエラーを返すことが多く、そのエラーがnil(エラーなし)かどうかを確認することが基本です。

例えば、「ファイルを開く」処理で問題がなければnilを返し、問題があればエラーの内容を返します。

この「エラーがあるかどうかを必ず確認する」という作業がエラーハンドリングの基本です。

2. エラーは必ず返り値で確認しよう

2. エラーは必ず返り値で確認しよう
2. エラーは必ず返り値で確認しよう

Go言語は例外(Javaのtry-catchのようなもの)がなく、エラーは戻り値で返します。これが特徴的で、初心者の方は最初びっくりするかもしれません。

しかしこの仕組みのおかげで、プログラムのどこでエラーが起きたかが明確にわかります。だからこそ、関数の戻り値で返されたエラーを必ず確認することが安全なプログラミングにつながります。


file, err := os.Open("data.txt")
if err != nil {
    // エラーがあればここで処理(ログ出力やエラーメッセージなど)
    fmt.Println("ファイルを開くのに失敗しました:", err)
    return
}
// ここからはエラーなしの処理
defer file.Close()

3. deferでリソースを必ず閉じる

3. deferでリソースを必ず閉じる
3. deferでリソースを必ず閉じる

ファイルやネットワーク接続などの資源(リソース)は使い終わったら必ず閉じる必要があります。Goではdeferという仕組みを使って、関数が終わるタイミングで必ず処理を実行できます。

これを使うと、エラーがあっても確実にリソースを解放できるので安全です。

4. panicとrecoverは特別なエラーハンドリング

4. panicとrecoverは特別なエラーハンドリング
4. panicとrecoverは特別なエラーハンドリング

panicはプログラムを強制停止させる命令で、基本的には通常のエラー処理とは違います。例えば、プログラムのバグや想定外の問題が起きたときに使います。

recoverは、panicで停止するのを防ぎ、プログラムを安全に続けるための仕組みです。ただし、これは高度な使い方なので、初心者はまず基本のエラー処理をしっかり覚えましょう。

5. エラーは具体的なメッセージを返そう

5. エラーは具体的なメッセージを返そう
5. エラーは具体的なメッセージを返そう

エラーの内容はできるだけわかりやすく、何が問題かがすぐにわかるように書きましょう。具体的なメッセージや原因が書かれていると、あとでトラブルを直しやすくなります。


if err != nil {
    return fmt.Errorf("設定ファイルを読み込めませんでした: %w", err)
}

%wはエラーを包み込む(ラップする)書き方で、あとで元のエラー情報を調べることができます。

6. エラーのラップ(包み込み)を活用しよう

6. エラーのラップ(包み込み)を活用しよう
6. エラーのラップ(包み込み)を活用しよう

複数の関数を通してエラーを返すときは、fmt.Errorf%wを使って元のエラーを残したまま新しいエラーを返すと良いです。これを「エラーのラップ」と言います。

こうすると、問題がどこで起きたのか、詳しく追跡しやすくなります。

7. エラー処理は早めに行う「早期リターン」

7. エラー処理は早めに行う「早期リターン」
7. エラー処理は早めに行う「早期リターン」

エラーを見つけたら、なるべくすぐに処理を終わらせたり、対処したりする「早期リターン」を使いましょう。

こうすることでコードが読みやすくなり、エラーの見落としも防げます。


result, err := someFunction()
if err != nil {
    // エラーならすぐ終わる
    return err
}
// ここからはエラーなしの処理

8. 標準ライブラリのエラー判定関数を活用しよう

8. 標準ライブラリのエラー判定関数を活用しよう
8. 標準ライブラリのエラー判定関数を活用しよう

Goにはerrors.Iserrors.Asという便利な関数があり、エラーの種類を判定できます。これらを使うことで、特定のエラーだけを処理したいときに便利です。


if errors.Is(err, os.ErrNotExist) {
    fmt.Println("ファイルが存在しません")
}

エラーの種類をしっかり判定することで、より正確な処理が可能になります。

9. ログにエラー内容を残そう

9. ログにエラー内容を残そう
9. ログにエラー内容を残そう

実際の開発では、エラーが起きたときにすぐ気づけるようにログに残すことが重要です。ログとは、プログラムの動きを記録するメモのようなもので、トラブルが起きたときの原因調査に役立ちます。

Goでは標準パッケージのlogを使うのが簡単です。


import "log"

if err != nil {
    log.Printf("エラー発生: %v", err)
}

10. エラーハンドリングのベストプラクティス

10. エラーハンドリングのベストプラクティス
10. エラーハンドリングのベストプラクティス
  • 必ず関数の戻り値のエラーをチェックする
  • エラー発生時は早めに処理を終える(早期リターン)
  • エラーはわかりやすいメッセージで返す
  • 必要に応じてdeferでリソースを確実に閉じる
  • エラーのラップで原因追跡をしやすくする
  • panicrecoverは特別な場合だけ使う
  • errors.Iserrors.Asでエラーの種類を判定する
  • ログにエラー情報を残しておく

これらを守ることで、Go言語でのエラーハンドリングがより安全でわかりやすくなります。

まとめ

まとめ
まとめ

エラーハンドリングの重要性と基本の考え方

Go言語のエラーハンドリングは、プログラムを安全に動かすための「土台」とも言える大切な要素です。特に初心者のうちは、エラーというだけで難しく感じたり、どう対応すればよいか迷ってしまいがちですが、Go言語の基本的な仕組みを理解すると、落ち着いて対処できるようになります。関数が返すerror型を確認し、問題があれば適切な処理に切り替えるという流れは、どんな場面でも役立ちます。また、エラー内容をわかりやすく整えて返したり、発生した場所を追跡しやすくする工夫は、後々の開発効率にも大きく関わります。

エラーを放置してしまうと、予期しない動作が起きてしまったり、原因がわからず調査が難しくなることもあるため、必ずチェックする習慣をつけることが重要です。特に外部からファイルを読み込む処理やネットワーク通信などは失敗する可能性が高く、丁寧なエラーハンドリングが欠かせません。初心者の方でも、仕組みと流れを理解し、小さなコードから練習していけば、自然と扱えるようになります。

わかりやすいエラー処理の簡単なサンプル

下のサンプルは、初心者でも取り組みやすい、基本の「エラーを確認する流れ」をまとめたものです。ファイルを読み込む処理は成功と失敗がはっきりしているため、練習にぴったりです。


package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("sample.txt")
    if err != nil {
        fmt.Println("ファイルを開けませんでした:", err)
        return
    }
    defer file.Close()

    fmt.Println("ファイルを正常に開けました")
}

このサンプルでは、まずos.Openでファイルを開き、戻り値のerrをチェックしています。もしファイルが存在しないなどの理由でエラーが発生した場合は、その時点で処理を終了し、エラー内容を表示します。逆に成功した場合は、ファイルを確実に閉じるためにdeferCloseを登録し、その後の処理に進みます。とてもシンプルですが、Go言語のエラーハンドリングの基本が詰まった例と言えるでしょう。

エラー内容を整える工夫と理解の深め方

初心者のうちは、どのようにエラーを返せばよいか迷うことが多いものです。そこで大切なのは、「あとから見ても原因がわかるようにメッセージを整える」ことです。具体的で状況がわかるエラー文にしておくと、自分だけでなく他の人が読んだときにも理解しやすくなります。また、関数が深く重なった処理では、エラーを%wを使ってラップしておくと、後から元の原因を調べやすくなります。

さらに、標準ライブラリのerrors.Iserrors.Asを使ってエラーの種類を判定すれば、状況によって異なる処理を選び分けることもできます。このように、エラーの内容を「ただ返す」だけでなく、「読みやすく整え」「正しい判定ができる形にする」ことで、プログラム全体がより理解しやすく、安全な構造へと整っていきます。

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

生徒

「今日の内容で、エラー処理がただの失敗チェックじゃなくて、プログラムを安全に動かすための大事な仕組みだってわかりました!」

先生

「そのとおりです。エラーハンドリングがしっかりしているほど、プログラムの信頼性も高まりますよ。特に初心者のうちは、エラーを確認する習慣をつけるのが大事ですね。」

生徒

「具体的なメッセージを返すとか、ラップして原因を残すとか、思ったより工夫できるところが多いんですね。」

先生

「そうなんです。誰が読んでも理解しやすいエラー処理は、それだけでコードの品質が上がります。焦らず一つずつ覚えて、今回学んだポイントを実際のコードでも試してみてくださいね。」

関連記事:
カテゴリの一覧へ
新着記事
New1
Kotlin
Kotlinのforループの基本!範囲・配列・コレクションの繰り返し処理
New2
Go言語
Go言語のスライスでappend時のメモリの仕組みを理解しよう!初心者でもわかる基礎解説
New3
Go言語
Go言語のスコープとは?ローカル変数・グローバル変数の違いと使い分け
New4
Go言語
Go言語のhttp.ResponseWriterとhttp.Requestの仕組みを理解しよう
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
No.2
Java&Spring記事人気No2
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.3
Java&Spring記事人気No3
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.4
Java&Spring記事人気No4
Swift
Swiftで数値と文字列を相互変換!NumberFormatterで桁区切りや通貨表示をわかりやすく解説
No.5
Java&Spring記事人気No5
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
No.6
Java&Spring記事人気No6
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.7
Java&Spring記事人気No7
Kotlin
Kotlinで画面遷移を実装しよう!初心者でもわかるIntentの使い方完全ガイド
No.8
Java&Spring記事人気No8
Swift
Swiftで0埋め・ゼロパディングを徹底解説!printf互換のformat活用法