0
0

GO言語のエラーハンドリング

GO言語では、エラーを示すために組み込みのerror型を使用します。例えば、os.Open関数はファイルを開く際に失敗すると非nilのerror値を返します。

f, err := os.Open("filename.ext")
if err != nil {
    log.Fatal(err)
}
// ファイルを開いた後の処理

error型の詳細

error型はインターフェース型であり、以下のように定義されています。

type error interface {
    Error() string
}

最も一般的なerrorの実装は、errorsパッケージのerrorString型です。

type errorString struct {
    s string
}

func (e *errorString) Error() string {
    return e.s
}

errors.New関数を使用してerrorStringを生成できます。

func New(text string) error {
    return &errorString{text}
}

カスタムエラーの作成

エラーに追加情報を持たせたい場合、カスタムエラー型を定義することができます。

type NegativeSqrtError float64

func (f NegativeSqrtError) Error() string {
    return fmt.Sprintf("math: square root of negative number %g", float64(f))
}

このようにすることで、エラーの詳細を呼び出し元が確認できるようになります。

エラーハンドリングの簡略化

GO言語ではエラーハンドリングが重要であり、明示的にエラーをチェックすることが推奨されています。以下のように、HTTPハンドラでエラーハンドリングを簡略化する方法があります。

type appHandler func(http.ResponseWriter, *http.Request) error

func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if err := fn(w, r); err != nil {
        http.Error(w, err.Error(), 500)
    }
}

func init() {
    http.Handle("/view", appHandler(viewRecord))
}

func viewRecord(w http.ResponseWriter, r *http.Request) error {
    c := appengine.NewContext(r)
    key := datastore.NewKey(c, "Record", r.FormValue("id"), 0, nil)
    record := new(Record)
    if err := datastore.Get(c, key, record); err != nil {
        return err
    }
    return viewTemplate.Execute(w, record)
}

このようにすることで、エラーハンドリングのコードを簡潔に保つことができます。

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0