J'ai récemment rencontré ce problème lors du développement de mon paquet d'aide.
Basé sur l'exemple de code ici : https://go-review.googlesource.com/c/go/+/213337/1/src/os/exec/example_test.go
func ExampleExitError() {
cmd := exec.Command("sleep", "-u")
err := cmd.Run()
var exerr *exec.ExitError
if errors.As(err, &exerr) {
fmt.Printf("the command exited unsuccessfully: %d\n", exerr.ExitCode())
}
Le code de sortie
J'ai fini par faire ce qui suit pour mon propre wrapper exec cmd :
// Return exit code
func (self *MyCmd) ExitCode() int {
var exitErr *exec.ExitError
if errors.As(self.Err, &exitErr) {
return exitErr.ExitCode()
}
// No error
return 0
}
self.Err
est la valeur de retour d'un exec.Command.Run()
. La liste complète est ici : https://github.com/J-Siu/go-helper/blob/master/myCmd.go
Message d'erreur textuel
Alors que la réponse de @colm.anseo tient compte de os.patherror
il ne donne pas de code d'erreur (int), et IMHO devrait être traité séparément. A la place, un message d'erreur textuel peut être extrait de execCmd.Stderr
aimer suivre :
func (self *MyCmd) Run() error {
execCmd := exec.Command(self.CmdName, *self.ArgsP...)
execCmd.Stdout = &self.Stdout
execCmd.Stderr = &self.Stderr
execCmd.Dir = self.WorkDir
self.CmdLn = execCmd.String()
self.Err = execCmd.Run()
self.Ran = true
ReportDebug(&self, "myCmd:", false, false)
ReportDebug(self.Stderr.String(), "myCmd:Stderr", false, false)
ReportDebug(self.Stdout.String(), "myCmd:Stdout", false, false)
return self.Err
}
self.Stderr
est un bytes.Buffer
et passer en execCmd
avant Run()
. Après execCmd.Run()
Le texte err peut être extrait à l'aide de self.Stderr.String()
.