feat: recover from panic
This commit is contained in:
parent
ab41926fc0
commit
4639e84ad5
|
@ -146,8 +146,18 @@ func mainImpl() (err error) {
|
|||
}
|
||||
|
||||
func main() {
|
||||
if err := mainImpl(); err != nil {
|
||||
slog.Error("main exit", "error", err)
|
||||
os.Exit(1)
|
||||
var err error
|
||||
exitCode := 0
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
slog.Error("panic recovered", "panic", r)
|
||||
exitCode = 2
|
||||
}
|
||||
if err != nil {
|
||||
slog.Error("main exit", "error", err)
|
||||
exitCode = 1
|
||||
}
|
||||
os.Exit(exitCode)
|
||||
}()
|
||||
err = mainImpl()
|
||||
}
|
||||
|
|
|
@ -22,7 +22,10 @@ func generateStages(confStages []conf.ConfStage, groups []string) (
|
|||
) {
|
||||
stages := []stage.Stage{}
|
||||
existNames := map[string]bool{}
|
||||
for _, s := range confStages {
|
||||
for i, s := range confStages {
|
||||
if s.Name == "" {
|
||||
s.Name = fmt.Sprintf("stage-%d", i)
|
||||
}
|
||||
if s.Group != "" {
|
||||
var ok bool
|
||||
for _, group := range groups {
|
||||
|
|
|
@ -16,6 +16,29 @@ func Run(stages []Stage) (
|
|||
var tmpParserResults []ParserResult
|
||||
slog.Info("stage run start")
|
||||
for _, stage := range stages {
|
||||
func() {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
slog.Error(
|
||||
"stage panic recovered",
|
||||
"stageName", stage.Name,
|
||||
"panic", r,
|
||||
)
|
||||
stageResults = append(stageResults, StageResult{
|
||||
Name: stage.Name,
|
||||
Results: []ParserResult{
|
||||
{
|
||||
Score: 0,
|
||||
Comment: "JOJ3 internal error. " +
|
||||
"Please contact the administrator.\n",
|
||||
},
|
||||
},
|
||||
ForceQuit: true,
|
||||
})
|
||||
forceQuitStageName = stage.Name
|
||||
err = fmt.Errorf("panic in stage %s: %v", stage.Name, r)
|
||||
}
|
||||
}()
|
||||
slog.Info("stage start", "name", stage.Name)
|
||||
slog.Info(
|
||||
"executor run start",
|
||||
|
@ -36,7 +59,7 @@ func Run(stages []Stage) (
|
|||
"name", stage.Executor.Name,
|
||||
)
|
||||
err = fmt.Errorf("executor not found: %s", stage.Executor.Name)
|
||||
return stageResults, forceQuitStageName, err
|
||||
return
|
||||
}
|
||||
executorResults, err = executor.Run(stage.Executor.Cmds)
|
||||
if err != nil {
|
||||
|
@ -46,7 +69,7 @@ func Run(stages []Stage) (
|
|||
"name", stage.Executor.Name,
|
||||
"error", err,
|
||||
)
|
||||
return stageResults, forceQuitStageName, err
|
||||
return
|
||||
}
|
||||
for i, executorResult := range executorResults {
|
||||
slog.Debug(
|
||||
|
@ -92,7 +115,7 @@ func Run(stages []Stage) (
|
|||
"name", stageParser.Name,
|
||||
)
|
||||
err = fmt.Errorf("parser not found: %s", stageParser.Name)
|
||||
return stageResults, forceQuitStageName, err
|
||||
return
|
||||
}
|
||||
var parserForceQuit bool
|
||||
tmpParserResults, parserForceQuit, err = parser.Run(
|
||||
|
@ -150,6 +173,7 @@ func Run(stages []Stage) (
|
|||
ForceQuit: forceQuitStageName != "",
|
||||
})
|
||||
slog.Debug("stage done", "name", stage.Name, "stageDetail", stageDetail)
|
||||
}()
|
||||
if forceQuitStageName != "" {
|
||||
break
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user