エラーハンドリング

1 件の記事

Contents

Do not swallow errors. (エラーを握りつぶさない)

解説

エラーを無視したり握りつぶしたりすると、問題の発生源を特定できず、デバッグが著しく困難になります。エラーは適切にログに記録するか、呼び出し元に返すべきです。エラーを無視することは、システムの健全性を監視できなくなり、予期しない動作やデータ破損につながる可能性があります。すべてのエラーは、少なくともログ記録または上位層への伝播のいずれかで処理されるべきです。

具体例

// 悪い例(エラーを握りつぶす)
func ProcessData() {
    data, err := fetchData()
    if err != nil {
        // エラーを無視
    }

    _ = saveData(data)  // エラーを無視
}

func SendEmail(to string) {
    err := emailClient.Send(to, "Hello")
    // errをチェックせずに無視
}

// 良い例(適切なエラー処理)
func ProcessData() error {
    data, err := fetchData()
    if err != nil {
        return fmt.Errorf("failed to fetch data: %w", err)
    }

    if err := saveData(data); err != nil {
        return fmt.Errorf("failed to save data: %w", err)
    }

    return nil
}

func SendEmail(to string) error {
    if err := emailClient.Send(to, "Hello"); err != nil {
        return fmt.Errorf("failed to send email to %s: %w", to, err)
    }
    return nil
}

// ログ記録する場合
func BackgroundTask() {
    if err := doSomething(); err != nil {
        log.Printf("background task failed: %v", err)
        // 呼び出し元に返せない場合はログに記録
    }
}

参考リンク