format_list_bulleted
【Golang】Golangのエラーハンドリングについて解説(errorインターフェース)
最終更新日時:2020-10-27 00:09:26



Golangではtry, catchなどを使ったエラーハンドリングは実装されていません。一方でerrorインターフェイスを用いたエラーハンドリングが標準で実装されています。今回はerrorインターフェースを用いたGolangのエラーハンドリングについて説明します。

errorインターフェースとは

errorインターフェースとはGolangに標準搭載されているインターフェースでError()という文字列を返すメソッドを持つ必要があるインターフェースです。公式ドキュメントでのerrorの説明にも同様の記載があります。

タイトル:errorインターフェース

type error interface {
    Error() string
}

errorインターフェースを使用したGolangのエラーハンドリング

それではerrorインターフェースを利用したエラーハンドリングの方法について解説します。今回使用したコードはcode-databaseのgithubリポジトリにも公開しているので手元で確認したい方はぜひ活用してみてください。

Golangのエラーハンドリングのやり方

Golangではerrorインターフェースを用いることでエラーハンドリングをします。例えばio/ioutilパッケージのReadFileメソッドはローカルファイルを読み込む機能がついています。このメソッドは以下のような関数です。

タイトル:ReadFileメソッド

func ReadFile(filename string) ([]byte, error)

このメソッドは上記の通り、戻り値の二つ目にerrorインターフェースのデータを返します。したがって、Golangではこの二つ目の戻り値を利用してエラーを扱います。

エラーの発生時は下のようなif分での条件分岐をしてpanicを発生させます。

bytes, err := ioutil.ReadFile("sample.txt")
if err != nil {
	panic(err.Error())
}

panicとはそれ以降のプログラムの実行を強制的に停止させるものです。

Golangのエラーハンドリングの例

先ほど紹介したio/ioutilパッケージのReadFileメソッドを用いた例を紹介します。

タイトル:main.go

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	bytes, err := ioutil.ReadFile("sample.txt")
	if err != nil {
		panic(err.Error())
	}
	fmt.Println(string(bytes))
}

sample.txtファイルを適切に開くことができたらerrのnilになるのでプログラムの実行が成功します。

タイトル:ターミナル

$ go run main.go

これだけではエラーハンドリングがうまくいったか分からないので二つのパターンのエラーを試してみます。

  • ファイルを読む権限が無いため実行ができない
  • ファイルがないため実行できない

まずはファイルの権限を変更してみます。

タイトル:ターミナル

$ chmod 100 sample.txt

ファイルの権限から読み込む権限を除きました。(chmodコマンドについての説明は割愛します)

この状態で再度プログラムを実行してみましょう。

タイトル:ターミナル

$ go run main.go

permission deniedと指摘されました。エラーハンドリングできています。

続いてsample.txtをディレクトリから消してしまいましょう。

タイトル:ターミナル

$ rm sample.txt

この状態で再度プログラムを実行します。

タイトル:ターミナル

$ go run main.go


今度はファイルがありませんと指摘されました。すばらしいです。

このようにerrorインターフェースを拾ってpanicでエラーを出力することでエラーハンドリングを行うことができます。

エラーをカスタマイズする

エラーを自分で作りたい時があると思います。errorインターフェースを満たしたデータを作ってくれます。errors.Newメソッドやfmt.Errorfメソッドを用いることで簡単い実装できます。

errors.Newを用いる方法

errorsパッケージのNewメソッドを用いることで、引数に入れた文字列を出力するError()メソッドを持ったerrorインターフェースのデータを作ってくれます。

タイトル:errors.New()

err := errors.New("カスタムしたエラーです")
panic(err.Error())

実行してみます。

タイトル:ターミナル

$ go run main.go

自分で指定した文字列が出力されます。

fmt.Errorfを用いる方法

fmtパッケージのErrorfメソッドを用いることで変数などを用いた文字列を出力するError()メソッドを持ったerrorインターフェースのデータを作ってくれます。

タイトル:fmt.Errorf()

name := "tanaka"
id := 1
err := fmt.Errorf("user %s (id %d) not found", name, id)
panic(err.Error())

実行してみます。

タイトル:ターミナル

$ go run main.go

nameidの変数が入った文字列が出力されます。

この記事のまとめ

本記事ではGolangでのエラーハンドリングについて紹介しました。最後に記事の要点についてまとめておきます。

  • errorインターフェースを用いることでGolangではエラーハンドリングができる
  • panicを用いて実行時のエラー処理を行う
  • エラーを独自に作成することもできる

皆さんもGolangできっちりエラーハンドリングしたコードを書きましょう!