From e01ecdf1db679dd2a0a94ca0144be61ea6a58e23 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 29 Jul 2025 13:33:58 +0300 Subject: [PATCH] add panic catch functions --- internal/core/utils/panic.go | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 internal/core/utils/panic.go diff --git a/internal/core/utils/panic.go b/internal/core/utils/panic.go new file mode 100644 index 0000000..04f65bf --- /dev/null +++ b/internal/core/utils/panic.go @@ -0,0 +1,51 @@ +package utils + +import ( + "log" + "runtime" + "strings" + + "golang.org/x/net/context" +) + +// temportary solution, pls dont judge +func trimStackPaths(stack []byte, folderName string) []byte { + lines := strings.Split(string(stack), "\n") + for i, line := range lines { + idx := strings.Index(line, folderName) + if idx != -1 { + indentEnd := strings.LastIndex(line[:idx], "\t") + if indentEnd == -1 { + indentEnd = 0 + } else { + indentEnd++ + } + start := idx + len(folderName) + 1 + if start > len(line) { + start = len(line) + } + lines[i] = line[:indentEnd] + line[start:] + } + } + return []byte(strings.Join(lines, "\n")) +} + +func CatchPanic() { + if err := recover(); err != nil { + stack := make([]byte, 8096) + stack = stack[:runtime.Stack(stack, false)] + stack = trimStackPaths(stack, "GoSally-mvp") + log.Printf("recovered panic:\n%s", stack) + } +} + +func CatchPanicWithContext(ctx context.Context) { + _, cancel := context.WithCancel(ctx) + if err := recover(); err != nil { + stack := make([]byte, 8096) + stack = stack[:runtime.Stack(stack, false)] + stack = trimStackPaths(stack, "GoSally-mvp") + log.Printf("recovered panic:\n%s", stack) + cancel() + } +}