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
|
||
|
}
|