こんにちは。KOUKIです。
とある企業でGo言語を使ったシステム開発業務に従事しています。
本日は、Errorメッセージのカスタマイズについて、記事にしました。
具体的には、以下のようなことをします。


前提条件
Mac OS上で動かしています。
ワークスペースの作成
ワークスペースを作成しましょう。
1 2 3 4 5 6 |
mkdir handle-error cd handle-error/ mkdir errors touch errors/errors.go touch main.go go mod init handle-error |
補足: go mod initに失敗する場合
「go mod init」コマンドで初期化に失敗する場合は、terminal上で「export GO111MODULE=on」を実行してください。
1 2 3 4 5 |
$ go mod init handle-error go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules' $ go mod init handle-error go mod init: go.mod already exists |
Echoサーバーの作成
golangのWebフレームワークの一つである「Echo」を使って、Webサーバーを作成します。main.goを以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "net/http" "github.com/labstack/echo/v4" ) type Data struct { Name string `json:"name"` } func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.JSON(http.StatusOK, Data{Name: "Harry Potter"}) }) e.Logger.Fatal(e.Start(":1323")) } |
以下のコマンドで、Echoサーバーを立ち上げてください。
1 2 3 4 5 6 7 8 9 10 11 |
$ go run main.go ____ __ / __/___/ / ___ / _// __/ _ \/ _ \ /___/\__/_//_/\___/ v4.1.17 High performance, minimalist Go web framework https://echo.labstack.com ____________________________________O/_______ O\ ⇨ http server started on [::]:1323 |
ブラウザから「localhost:1323」にアクセスします。

JSON形式で値を返すようにしたので、上記のように表示されます。
カスタムエラーメッセージ
さて、カスタムエラーメッセージを作成しましょう。
Error structを作る
最初にエラーメッセージを格納するError Structを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 |
// errors.go package errors type Error struct { ErrMsg string `json:"error_message"` } func NewError(err error) *Error { return &Error{ ErrMsg: err.Error(), } } |
これは、以下のように使います。
1 2 3 4 5 6 7 8 9 10 11 12 |
func main() { e := echo.New() e.GET("/", func(c echo.Context) error { // 適当なErrorを作る err1 := errors.New("HTTP Request Error") err := customErr.NewError(err1) return c.JSON(http.StatusInternalServerError, err) }) e.Logger.Fatal(e.Start(":1323")) } |
結果は、次のようになります。

エラーメッセージを表示できるようになりました。
エラーメッセージを構造化する
続いて、先ほどのエラーメッセージを構造化してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// errors.go package errors type ErrBody struct { ErrMsg string `json:"error_message"` } type Error struct { ErrMsg string `json:"error_message"` Err ErrBody `json:"error"` } func NewError(err error) *Error { return &Error{ ErrMsg: err.Error(), Err: ErrBody{ ErrMsg: err.Error(), }, } } |
Go言語では、Structの中にStructを入れることで、構造化できます。
実行結果は、以下のようになりました。

複数のエラーを受け取る(オプション)
オプションとして、複数のエラーを受け取れるようにしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// errors.go package errors type ErrBody struct { ErrMsg string `json:"error_message"` } type Error struct { ErrMsg string `json:"error_message"` // スライスに変更 Errs []ErrBody `json:"error"` } func NewError(err error, others ...error) *Error { errs := make([]ErrBody, 0, len(others)) for _, other := range others { errs = append(errs, ErrBody{ErrMsg: other.Error()}) } return &Error{ ErrMsg: err.Error(), Errs: errs, } } |
「…error」の「…」は、引数をいくらでも受け取れるようにするためのものです。
以下のように使うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
func main() { e := echo.New() e.GET("/", func(c echo.Context) error { // 適当なErrorを作る err1 := errors.New("HTTP Request Error") err2 := errors.New("Internal Server Error") err3 := errors.New("Error Code: 500") err := customErr.NewError(err1, err2, err3) return c.JSON(http.StatusInternalServerError, err) }) e.Logger.Fatal(e.Start(":1323")) } |

これで、いくらでもエラーメッセーを放り込むことができますね。
おわりに
簡単ですが、以上です。
基本的にはデフォルトのエラーメッセージを返せばOKだと思いますが、運用などで「こんなエラーが返して欲しい」などの要望があった時、エラーメッセージをカスタマイズできれば便利ですよね。
それでは、また!
コメントを残す
コメントを投稿するにはログインしてください。