feat: recover from panic
This commit is contained in:
		
							parent
							
								
									ab41926fc0
								
							
						
					
					
						commit
						4639e84ad5
					
				|  | @ -146,8 +146,18 @@ func mainImpl() (err error) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func main() { | func main() { | ||||||
| 	if err := mainImpl(); err != nil { | 	var err error | ||||||
| 		slog.Error("main exit", "error", err) | 	exitCode := 0 | ||||||
| 		os.Exit(1) | 	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{} | 	stages := []stage.Stage{} | ||||||
| 	existNames := map[string]bool{} | 	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 != "" { | 		if s.Group != "" { | ||||||
| 			var ok bool | 			var ok bool | ||||||
| 			for _, group := range groups { | 			for _, group := range groups { | ||||||
|  |  | ||||||
|  | @ -16,6 +16,29 @@ func Run(stages []Stage) ( | ||||||
| 	var tmpParserResults []ParserResult | 	var tmpParserResults []ParserResult | ||||||
| 	slog.Info("stage run start") | 	slog.Info("stage run start") | ||||||
| 	for _, stage := range stages { | 	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("stage start", "name", stage.Name) | ||||||
| 			slog.Info( | 			slog.Info( | ||||||
| 				"executor run start", | 				"executor run start", | ||||||
|  | @ -36,7 +59,7 @@ func Run(stages []Stage) ( | ||||||
| 					"name", stage.Executor.Name, | 					"name", stage.Executor.Name, | ||||||
| 				) | 				) | ||||||
| 				err = fmt.Errorf("executor not found: %s", 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) | 			executorResults, err = executor.Run(stage.Executor.Cmds) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
|  | @ -46,7 +69,7 @@ func Run(stages []Stage) ( | ||||||
| 					"name", stage.Executor.Name, | 					"name", stage.Executor.Name, | ||||||
| 					"error", err, | 					"error", err, | ||||||
| 				) | 				) | ||||||
| 			return stageResults, forceQuitStageName, err | 				return | ||||||
| 			} | 			} | ||||||
| 			for i, executorResult := range executorResults { | 			for i, executorResult := range executorResults { | ||||||
| 				slog.Debug( | 				slog.Debug( | ||||||
|  | @ -92,7 +115,7 @@ func Run(stages []Stage) ( | ||||||
| 						"name", stageParser.Name, | 						"name", stageParser.Name, | ||||||
| 					) | 					) | ||||||
| 					err = fmt.Errorf("parser not found: %s", stageParser.Name) | 					err = fmt.Errorf("parser not found: %s", stageParser.Name) | ||||||
| 				return stageResults, forceQuitStageName, err | 					return | ||||||
| 				} | 				} | ||||||
| 				var parserForceQuit bool | 				var parserForceQuit bool | ||||||
| 				tmpParserResults, parserForceQuit, err = parser.Run( | 				tmpParserResults, parserForceQuit, err = parser.Run( | ||||||
|  | @ -150,6 +173,7 @@ func Run(stages []Stage) ( | ||||||
| 				ForceQuit: forceQuitStageName != "", | 				ForceQuit: forceQuitStageName != "", | ||||||
| 			}) | 			}) | ||||||
| 			slog.Debug("stage done", "name", stage.Name, "stageDetail", stageDetail) | 			slog.Debug("stage done", "name", stage.Name, "stageDetail", stageDetail) | ||||||
|  | 		}() | ||||||
| 		if forceQuitStageName != "" { | 		if forceQuitStageName != "" { | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user