mirror of
https://github.com/spf13/cobra
synced 2025-05-05 04:47:22 +00:00
feat: added custom error handler function
This commit is contained in:
parent
d4040ad8db
commit
5feb403e5e
2 changed files with 40 additions and 2 deletions
17
command.go
17
command.go
|
@ -161,6 +161,9 @@ type Command struct {
|
|||
// versionTemplate is the version template defined by user.
|
||||
versionTemplate string
|
||||
|
||||
// errorHandlerFunc allows setting a custom error handler by the user.
|
||||
errorHandlerFunc func(error)
|
||||
|
||||
// inReader is a reader defined by the user that replaces stdin
|
||||
inReader io.Reader
|
||||
// outWriter is a writer defined by the user that replaces stdout
|
||||
|
@ -323,6 +326,12 @@ func (c *Command) SetGlobalNormalizationFunc(n func(f *flag.FlagSet, name string
|
|||
}
|
||||
}
|
||||
|
||||
// SetErrorHandlerFunc is the function that will be called, if set, when there is any kind of error in the
|
||||
// execution of the command.
|
||||
func (c *Command) SetErrorHandlerFunc(f func(error)) {
|
||||
c.errorHandlerFunc = f
|
||||
}
|
||||
|
||||
// OutOrStdout returns output to stdout.
|
||||
func (c *Command) OutOrStdout() io.Writer {
|
||||
return c.getOut(os.Stdout)
|
||||
|
@ -979,7 +988,11 @@ func (c *Command) ExecuteC() (cmd *Command, err error) {
|
|||
c = cmd
|
||||
}
|
||||
if !c.SilenceErrors {
|
||||
if c.errorHandlerFunc != nil {
|
||||
c.errorHandlerFunc(err)
|
||||
} else {
|
||||
c.PrintErrln("Error:", err.Error())
|
||||
}
|
||||
c.PrintErrf("Run '%v --help' for usage.\n", c.CommandPath())
|
||||
}
|
||||
return c, err
|
||||
|
@ -1008,8 +1021,12 @@ func (c *Command) ExecuteC() (cmd *Command, err error) {
|
|||
// If root command has SilenceErrors flagged,
|
||||
// all subcommands should respect it
|
||||
if !cmd.SilenceErrors && !c.SilenceErrors {
|
||||
if c.errorHandlerFunc != nil {
|
||||
c.errorHandlerFunc(err)
|
||||
} else {
|
||||
c.PrintErrln("Error:", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
// If root command has SilenceUsage flagged,
|
||||
// all subcommands should respect it
|
||||
|
|
|
@ -17,6 +17,7 @@ package cobra
|
|||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
|
@ -2430,3 +2431,23 @@ func TestHelpflagCommandExecutedWithoutVersionSet(t *testing.T) {
|
|||
checkStringContains(t, output, HelpFlag)
|
||||
checkStringOmits(t, output, VersionFlag)
|
||||
}
|
||||
|
||||
func TestSetCustomErrorHandler(t *testing.T) {
|
||||
var writer bytes.Buffer
|
||||
handler := func(err error) {
|
||||
writer.Write([]byte(err.Error()))
|
||||
}
|
||||
|
||||
root := &Command{
|
||||
Use: "root",
|
||||
RunE: func(cmd *Command, args []string) error {
|
||||
return errors.New("test error handler function")
|
||||
},
|
||||
SilenceUsage: true,
|
||||
}
|
||||
root.SetErrorHandlerFunc(handler)
|
||||
_ = root.Execute()
|
||||
if writer.String() != "test error handler function" {
|
||||
t.Errorf("Expected error handler to contain [%s] instead it contains [%s]", "test error handler function", writer.String())
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue