« Back to Index

Go: Custom Error Handling

View original Gist on GitHub

Tags: #go #errors

main.go

package main

import (
	"errors"
	"fmt"
	"io"
)

func main() {
	err := doSomething()
	fe := &FooError{}
	if errors.As(err, fe) {
		fmt.Printf("it's a FooError: %#v\n", fe) // &main.FooError{Op:"doSomething", Err:(*errors.errorString)(0x556720)}
		fmt.Printf("%#v\n", fe.Op)  // "doSomething"
		fmt.Printf("%#v\n", fe.Err) // &errors.errorString{s:"EOF"}
	}
}

type FooError struct {
	Op  string
	Err error
}

func (e FooError) Error() string {
	return fmt.Sprintf("operation %s: %v", e.Op, e.Err)
}

func (e FooError) Unwrap() error {
	return e.Err
}

func doSomething() error {
	return FooError{
		Op:  "doSomething",
		Err: io.EOF,
	}
}