Go: Create a custom error
First, two out-of-the-box options:
// Simple string-based error:
err1 := errors.New("Houston, we have a problem")
// With formatting:
err2 := fmt.Errorf("%d errors, %d warnings", errCount, warnCount)
Custom errors with data
All you need to do is satisfy the predeclared error
interface:
type error interface {
Error() string
}
Example: Here's a SyntaxError
with line and position:
type SyntaxError struct {
Line int
Col int
}
func (e *SyntaxError) Error() string {
return fmt.Sprintf("%d:%d: Syntax error",
e.Line, e.Col)
}
You create it as follows:
err := &SyntaxError{
Line: 17,
Col: 55,
}
Let's do another one:
Example: Here's an InternalError
:
type InternalError struct {
Path string
}
func (e *InternalError) Error() string {
return fmt.Sprintf("parse %v: internal error", e.Path)
}
Handling the errors
Suppose RiskyFunction
may return a SyntaxError
or an InternalError
. Here's how you would handle the two cases:
if err := RiskyFunction(); err != nil {
switch e := err.(type) {
case *SyntaxError:
// Do something interesting with e.Line and e.Col.
case *InternalError:
// Abort and file an issue.
default:
log.Println(e)
}
}
Comments
Be the first to comment!