-
Notifications
You must be signed in to change notification settings - Fork 2
/
briefs.go
84 lines (75 loc) · 2.83 KB
/
briefs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package throw
import "fmt"
// E creates an error by the provided message and description. Description can be a log structure
func E(msg string, description ...interface{}) error {
if len(description) == 1 {
if err, ok := description[0].(error); ok {
return W(err, msg)
}
}
return New(msg, description...)
}
// W wraps the given error with provided message and details.
// Returns nil when (err) == nil
func W(err error, msg string, description ...interface{}) error {
if err == nil {
return nil
}
return WithDetails(err, New(msg, description...))
}
// R takes recovered panic and previous error if any, then wraps them together with current stack
// Returns (prevErr) when (recovered) is nil.
// NB! Must be called inside defer, e.g. defer func() { err = R(recover(), err) } ()
func R(recovered interface{}, prevErr error) error {
if recovered == nil {
return prevErr
}
err := WrapPanicExt(recovered, recoverSkipFrames+1)
if prevErr == nil {
return err
}
return WithDetails(err, prevErr)
}
// RW takes recovered panic, previous error if any, then wraps them together with current stack and message.
// Returns (prevErr) when (recovered) is nil. Description can be a log structure
// NB! Must be called inside defer, e.g. defer func() { err = RW(recover(), err, "msg", x) } ()
func RW(recovered interface{}, prevErr error, msg string, description ...interface{}) error {
if recovered == nil {
return prevErr
}
err := WrapPanicExt(recovered, recoverSkipFrames+1)
d := New(msg, description...)
return WithDetails(err, WithDetails(prevErr, d))
}
// Rn takes recovered panic and reports it as an error, without a panic mark. Result is wrapped with current stack.
// NB! Must be called inside defer, e.g. defer func() { err = Rn(recover(), err) } ()
func Rn(recovered interface{}, prevErr error) error {
if recovered == nil {
return prevErr
}
err := WithStackExt(NewDescription(recovered), recoverSkipFrames+1)
return WithDetails(err, prevErr)
}
// Rn takes recovered panic, previous error if any, then wraps them together with current stack and message. But without a panic mark.
// NB! Must be called inside defer, e.g. defer func() { err = RWn(recover(), err, "msg", x) } ()
func RWn(recovered interface{}, prevErr error, msg string, details ...interface{}) error {
if recovered == nil {
return prevErr
}
err := WithStackExt(NewDescription(recovered), recoverSkipFrames+1)
d := New(msg, details...)
return WithDetails(err, WithDetails(prevErr, d))
}
// deprecated
// Wrapf must be replaced with throw.W and struct for details
func Wrapf(err error, format string, args ...interface{}) error {
if err == nil {
return nil
}
return W(err, fmt.Sprintf(format, args...))
}
// deprecated
// Errorf must be replaced with either throw.New or with fmt.Errorf
func Errorf(format string, args ...interface{}) error {
return fmt.Errorf(format, args...)
}