Error Wrapping Uses Wrong Format Verb

non-wrapping format verb for fmt.Errorf. Use `%w` to format errors (errorlint)

Quick Answer

Use %w instead of %v or %s in fmt.Errorf to properly wrap errors. Only %w allows errors.Is and errors.As to unwrap the chain.

Why This Happens

fmt.Errorf with %v converts the error to a string, losing the error chain. Using %w wraps the original error so that errors.Is() and errors.As() can still find it. This is essential for proper error handling in Go 1.13+.

The Problem

func readConfig(path string) error {
    data, err := os.ReadFile(path)
    if err != nil {
        return fmt.Errorf("failed to read config: %v", err) // loses error chain
    }
    _ = data
    return nil
}

The Fix

func readConfig(path string) error {
    data, err := os.ReadFile(path)
    if err != nil {
        return fmt.Errorf("failed to read config: %w", err) // preserves error chain
    }
    _ = data
    return nil
}

Step-by-Step Fix

  1. 1

    Identify %v with errors

    Find fmt.Errorf calls that format errors with %v or %s instead of %w.

  2. 2

    Replace with %w

    Change the format verb to %w to wrap the error properly.

  3. 3

    Verify unwrapping

    Test that errors.Is() and errors.As() work correctly with the wrapped error.

Bugsly catches this automatically

Bugsly's AI analyzes this error pattern in real-time, explains what went wrong in plain English, and suggests the exact fix — before your users even report it.

Try Bugsly free