Custom error types can carry structured information while still acting like errors.

Error method A type satisfies Go's `error` interface when it has an `Error() string` method.

Custom Error Types

input
custom_error.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

type ValidationError struct {
	Field string
}

func (v ValidationError) Error() string {
	return "missing " + v.Field
}

func validate(value string) error {
	if value == "" {
		return ValidationError{Field: "name"}
	}
	return nil
}

func main() {
	var input = ""
	err := validate(input)

	if err != nil {
		fmt.Println("valid=", false)
		fmt.Println("error=", err)
	} else {
		fmt.Println("valid=", true)
		fmt.Println("input=", input)
	}
}
package main

import "fmt"

type ValidationError struct {
	Field string
}

func (v ValidationError) Error() string {
	return "missing " + v.Field
}

func validate(value string) error {
	if value == "" {
		return ValidationError{Field: "name"}
	}
	return nil
}

func main() {
	var input = "Ada"
	err := validate(input)

	if err != nil {
		fmt.Println("valid=", false)
		fmt.Println("error=", err)
	} else {
		fmt.Println("valid=", true)
		fmt.Println("input=", input)
	}
}
package main

import "fmt"

type ValidationError struct {
	Field string
}

func (v ValidationError) Error() string {
	return "missing " + v.Field
}

func validate(value string) error {
	if value == "" {
		return ValidationError{Field: "name"}
	}
	return nil
}

func main() {
	var input = "Go"
	err := validate(input)

	if err != nil {
		fmt.Println("valid=", false)
		fmt.Println("error=", err)
	} else {
		fmt.Println("valid=", true)
		fmt.Println("input=", input)
	}
}
  1. input ← ""

    20func main() {21  var input→ "" = "" //@input="Ada", "Go"22  err := validate(input"")
  2. func validate(value string) error

    13func validate(value"" string) error {14  if value == "" {
  3. if value == ""

    13func validate(value string) error {14  if value"" == "" {15    return ValidationError{Field: "name"}16  }
  4. err ← main.ValidationError{Field:"name"}

    21var input = "" //@input="Ada", "Go"22err→ main.ValidationError{Field:"name"} := validate(input"")
  5. if err != nil

    24if errmain.ValidationError{Field:"name"} != nil {25  fmt.Println("valid=", false)26  fmt.Println("error=", errmain.ValidationError{Field:"name"})27} else {
    outputvalid= false
  6. func (v ValidationError) Error() string

    9func (v ValidationError) Error() string {10  return "missing " + v.Field"name"11}
  7. fmt.Println("error=", err)

    25  fmt.Println("valid=", false)26  fmt.Println("error=", errmain.ValidationError{Field:"name"})27} else {
    outputerror= missing name
  1. input ← "Ada"

    20func main() {21  var input→ "Ada" = "Ada"22  err := validate(input"Ada")
  2. func validate(value string) error

    13func validate(value"Ada" string) error {14  if value == "" {15    return ValidationError{Field: "name"}16  }17  return nil18}
  3. err ← <nil>

    21var input = "Ada"22err→ <nil> := validate(input"Ada")
  4. else

    26  fmt.Println("error=", err)27} else {28  fmt.Println("valid=", true)29  fmt.Println("input=", input"Ada")30}
    outputvalid= true
    input= Ada
  1. input ← "Go"

    20func main() {21  var input→ "Go" = "Go"22  err := validate(input"Go")
  2. func validate(value string) error

    13func validate(value"Go" string) error {14  if value == "" {15    return ValidationError{Field: "name"}16  }17  return nil18}
  3. err ← <nil>

    21var input = "Go"22err→ <nil> := validate(input"Go")
  4. else

    26  fmt.Println("error=", err)27} else {28  fmt.Println("valid=", true)29  fmt.Println("input=", input"Go")30}
    outputvalid= true
    input= Go