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)
}
このようにすることで、エラーハンドリングのコードを簡潔に保つことができます。
参考記事