mirror of
https://github.com/tursom/GoCollections.git
synced 2025-02-12 10:40:15 +08:00
61 lines
1.0 KiB
Go
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
|
|
}
|