#11 Goで学ぶエラーハンドリングの基本

Goのエラーハンドリングは、他の言語のような「例外」を使わず、エラーを戻り値として扱うという明確な考え方が特徴です。この記事では、Goにおけるエラーハンドリングの基本と、関連する仕組みを解説します。

エラーを戻り値として返す

以前の記事でも触れた通り、Goの関数はエラーを戻り値として返すのが基本です。

func divide(a int, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("0では割れません")
    }
    return a / b, nil
}

if文でエラーを確認する

関数を呼び出した後は、必ずエラーが返ってきていないかを確認する書き方が定番です。

result, err := divide(10, 0)
if err != nil {
    fmt.Println("エラー:", err)
    return
}
fmt.Println("結果:", result)

エラーに情報を付け加える

エラーが発生した場所の情報を追加して、別のエラーとして包み直す(ラップする)ことができます。

result, err := divide(10, 0)
if err != nil {
    return fmt.Errorf("計算処理に失敗: %w", err)
}

%wという書式を使うと、元のエラー情報を保持したまま新しいエラーを作れるため、後からerrors.Isやerrors.Unwrapで元のエラーを調べることもできます。

panicという最終手段

Goには、プログラムを強制的に停止させるpanicという仕組みもありますが、これは通常のエラー処理には使わず、回復不可能な致命的な問題が起きたときの最終手段として位置づけられています。recoverという機能を使えばpanicから復帰することもできますが、通常のエラー処理としては使わないのがGoの慣習です。

センチネルエラーで種類を判定する

特定のエラーかどうかを判定したい場合、あらかじめ定義しておいたエラー変数とerrors.Isで比較する方法がよく使われます。

var ErrNotFound = errors.New("見つかりません")

func find(id int) error {
    return ErrNotFound
}

if errors.Is(find(1), ErrNotFound) {
    fmt.Println("データが見つかりませんでした")
}

Goならではの注意点

「if err != nil」という書き方が何度も登場するのは、Goのコードの見た目の特徴でもあります。冗長に感じるかもしれませんが、エラーの可能性を毎回明示的に確認するという、Goの安全性への考え方の表れです。

まとめ

Goのエラーハンドリングはエラーを戻り値として扱い、if err != nilで確認するのが基本です。%wによるエラーのラップも活用しつつ、panicはあくまで最終手段として使いましょう。


本ページはプロモーションを含みます。

参考書籍(PR)

Goをもっと学びたい方には「Go言語入門」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本