48 lines
912 B
Go
48 lines
912 B
Go
package errors
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
func PrintErrorDetails(err error) []string {
|
|
type stackTracer interface {
|
|
StackTrace() StackTrace
|
|
}
|
|
type errWithStack struct {
|
|
err error
|
|
msg string
|
|
stack StackTrace
|
|
}
|
|
|
|
var stackErrs []errWithStack
|
|
errCause := err
|
|
for errCause != nil {
|
|
stackErr := errWithStack{
|
|
err: errCause,
|
|
msg: errCause.Error(),
|
|
}
|
|
//nolint:errorlint
|
|
if s, ok := errCause.(stackTracer); ok {
|
|
stackErr.stack = s.StackTrace()
|
|
}
|
|
stackErrs = append(stackErrs, stackErr)
|
|
errCause = errors.Unwrap(errCause)
|
|
if err == nil {
|
|
break
|
|
}
|
|
}
|
|
|
|
var lines []string
|
|
for _, stackErr := range stackErrs {
|
|
if len(stackErr.stack) > 0 {
|
|
frame := stackErr.stack[0]
|
|
lines = append(lines, fmt.Sprintf("(%T) %+v: %s", stackErr.err, frame, stackErr.msg))
|
|
} else {
|
|
lines = append(lines, fmt.Sprintf("(%T) %s", stackErr.err, stackErr.msg))
|
|
}
|
|
}
|
|
|
|
return lines
|
|
}
|