GoCollections/exceptions/StackTrace.go
2022-03-21 11:02:41 +08:00

61 lines
1.0 KiB
Go

package exceptions
import (
"fmt"
"io"
"runtime"
"strings"
)
type StackTrace struct {
pc uintptr
file string
line int
}
func (s StackTrace) Pc() uintptr {
return s.pc
}
func (s StackTrace) File() string {
return s.file
}
func (s StackTrace) Line() int {
return s.line
}
func (s StackTrace) Print(writer io.Writer) {
_, err := fmt.Fprint(writer, "at", s.file, s.line)
if err != nil {
return
}
}
func (s StackTrace) PrintLn(writer io.Writer) {
_, err := fmt.Fprintf(writer, "\tat %s(%d)\n", s.file, s.line)
if err != nil {
return
}
}
func (s StackTrace) WriteTo(builder *strings.Builder) {
builder.WriteString(fmt.Sprintf("\tat %s(%d)\n", s.file, s.line))
}
func GetStackTrace() []StackTrace {
return GetStackTraceSkipDeep(0)
}
func GetStackTraceSkipDeep(deep int) []StackTrace {
stackTrace := make([]StackTrace, 0, 16)
for i := deep + 1; ; i++ {
pc, file, line, ok := runtime.Caller(i)
if !ok {
break
}
stackTrace = append(stackTrace, StackTrace{pc, file, line})
}
return stackTrace
}