Interfaces and Errors
Custom Error Types
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
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)
}
}
input ← ""
20func main() {21 var input→ "" = "" //@input="Ada", "Go"22 err := validate(input"")func validate(value string) error
13func validate(value"" string) error {14 if value == "" {if value == ""
13func validate(value string) error {14 if value"" == "" {15 return ValidationError{Field: "name"}16 }err ← main.ValidationError{Field:"name"}
21var input = "" //@input="Ada", "Go"22err→ main.ValidationError{Field:"name"} := validate(input"")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= falsefunc (v ValidationError) Error() string
9func (v ValidationError) Error() string {10 return "missing " + v.Field"name"11}fmt.Println("error=", err)
25 fmt.Println("valid=", false)26 fmt.Println("error=", errmain.ValidationError{Field:"name"})27} else {outputerror= missing name
input ← "Ada"
20func main() {21 var input→ "Ada" = "Ada"22 err := validate(input"Ada")func validate(value string) error
13func validate(value"Ada" string) error {14 if value == "" {15 return ValidationError{Field: "name"}16 }17 return nil18}err ← <nil>
21var input = "Ada"22err→ <nil> := validate(input"Ada")else
26 fmt.Println("error=", err)27} else {28 fmt.Println("valid=", true)29 fmt.Println("input=", input"Ada")30}outputvalid= true input= Ada
input ← "Go"
20func main() {21 var input→ "Go" = "Go"22 err := validate(input"Go")func validate(value string) error
13func validate(value"Go" string) error {14 if value == "" {15 return ValidationError{Field: "name"}16 }17 return nil18}err ← <nil>
21var input = "Go"22err→ <nil> := validate(input"Go")else
26 fmt.Println("error=", err)27} else {28 fmt.Println("valid=", true)29 fmt.Println("input=", input"Go")30}outputvalid= true input= Go