feat: recover from panic
All checks were successful
submodules sync / sync (push) Successful in 1m4s
build / build (push) Successful in 2m21s
build / trigger-build-image (push) Successful in 11s

This commit is contained in:
张泊明518370910136 2025-03-31 05:36:47 -04:00
parent ab41926fc0
commit 4639e84ad5
GPG Key ID: D47306D7062CDA9D
3 changed files with 153 additions and 116 deletions

View File

@ -146,8 +146,18 @@ func mainImpl() (err error) {
}
func main() {
if err := mainImpl(); err != nil {
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)
os.Exit(1)
exitCode = 1
}
os.Exit(exitCode)
}()
err = mainImpl()
}

View File

@ -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 {

View File

@ -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
}