Before learning about different ways of creating am an error in Golang lets first understand about the error. Error is an interface type with below signature
type error interface {
Error() string
}
Any by definition of interface any type which implements the Error() method becomes of type error.
Let’s see now different methods of creating an error
1. Using errors.New(“some_error_message”)
package main
import (
"errors"
"fmt"
)
func main() {
sampleErr := errors.New("error occured")
fmt.Println(sampleErr)
}
Output:
error occured
2. Using fmt.Errorf(“error is %s”, “some_error_message”). This way creates error with formatting of error messages
package main
import (
"fmt"
)
func main() {
sampleErr := fmt.Errorf("Err is: %s", "database connection issue")
fmt.Println(sampleErr)
}
Output:
Err is: database connection issue
3. Creating Custom error
The below example illustrates the use of custom error. In below example
- inputError is a struct that has the Error() method hence it is of type error
- You can also add additional information to the custom error by extending its fields or by adding new methods. inputError has an additional field named missingFields and a function getMissingFields function.
- We can use type assertion to convert from error to inputError
Example:
package main
import "fmt"
type inputError struct {
message string
missingField string
}
func (i *inputError) Error() string {
return i.message
}
func (i *inputError) getMissingField() string {
return i.missingField
}
func main() {
err := validate("", "")
if err != nil {
if err, ok := err.(*inputError); ok {
fmt.Println(err)
fmt.Printf("Missing Field is %s\n", err.getMissingField())
}
}
}
func validate(name, gender string) error {
if name == "" {
return &inputError{message: "Name is mandatory", missingField: "name"}
}
if gender == "" {
return &inputError{message: "Gender is mandatory", missingField: "gender"}
}
return nil
}
Output:
Name is mandatory
Missing Field is name