Skip to content

使い方 #19

@myuon

Description

@myuon

主に、弊社でバックエンドを書いていてエラーを作りたくなった場合のこのライブラリの使い方について、ガイドとして示します。

エラーを定義する

例として、あるデータがinvalidであることを示すエラーを定義したいとします。

const (
    ErrorInvalidData merrors.ErrorType = "invalid_data"
)

func InvalidData(msg string) error {
	return merrors.ErrorBadRequest(msg, ErrorInvalidData)
}

のように定義し、InvalidData関数を使ってください。
InvalidDataの中で ErrorBadRequest を利用すると、これをhandlerから返した場合には400エラーとなってresponseが返ります。もしも500エラーにしたい時は ErrorInternalServerError を、404エラーにしたい時は ErrorNotFound を使う、と言った使い分けを行って下さい。

備考: InternalServerErrorの場合は、msgはクライアントに返却されなくなります。これはセキュリティ的な理由によるものです。

上記の場合は、レスポンスは

{
  "error": "msgに指定した文字列",
  "error_type": "invalid_data"
}

のようなJSONになります。

エラーの比較

関数から返ってきたエラーが特定のエラー型を持っているか知りたい場合は、 ErrorTypeEqual を利用してください。
ErrorTypeEqualはerrorTypeが等しいかどうかを見ますが、msgの違いは無視します。テストの時などに有用です。

想定される使い方:

data, err := repo.FindById(hogeId)
if merrors.ErrorTypeEqual(err, InvalidData("")) {
   // errがInvalidDataだったら何かをする
}

スタックトレースの利用

このライブラリで作成されたエラーについてはstacktraceおよび呼び出し元の情報が自動で入ります。バックエンドでの適切なロギングが行われた場合に、エラー箇所がわかるので有用です。

DBErrorの利用

DB上でエラーを返す際(典型的にはrepositoryの中など)、 DBError 関数で包んでおくと、stacktraceの情報が自動で挿入されるので便利です。
例えばSQLとして処理できない状況になった際、ログにrepositoryのどの行で実際にエラーになったかがわかるようになるので以下の書き方を基本的に推奨します。

func (repo HogeRepository) Save() error {
	if err := repo.db.Conn.Save(&record).Error; err != nil {
		return merrors.DBError(err)
	}

    return nil
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions