...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package execution
16
17 import (
18 goerrors "errors"
19 "fmt"
20 "runtime/debug"
21 "strings"
22
23 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/controller/errors"
24 )
25
26
27
28 func RecoverWithGenericError(err *error) {
29 if rec := recover(); rec != nil {
30 handleRecovery(err, rec, goerrors.New)
31 }
32 }
33
34
35 func RecoverWithInternalError(err *error) {
36 newError := func(message string) error {
37 return errors.NewInternalError("panic", message)
38 }
39 if rec := recover(); rec != nil {
40 handleRecovery(err, rec, newError)
41 }
42 }
43
44 type NewErrorFunc func(message string) error
45
46 func handleRecovery(err *error, rec interface{}, newError NewErrorFunc) {
47 stack := debug.Stack()
48 formattedStack := string(stack)
49
50
51
52
53
54 for i := 0; i < 6; i++ {
55 formattedStack = safeRemoveFirstLine(formattedStack)
56 }
57
58 formattedStack = strings.ReplaceAll(formattedStack, "\n", "\n\t")
59 *err = newError(fmt.Sprintf("observed a panic: %+v\n%v", rec, formattedStack))
60 }
61
62 func safeRemoveFirstLine(value string) string {
63 idx := strings.Index(value, "\n")
64 if idx >= 0 {
65 if len(value) > idx+1 {
66 idx += 1
67 }
68 return value[idx:]
69 }
70 return value
71 }
72
View as plain text