github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/throw/briefs.go (about) 1 // Copyright 2020 Insolar Network Ltd. 2 // All rights reserved. 3 // This material is licensed under the Insolar License version 1.0, 4 // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md. 5 6 package throw 7 8 import "fmt" 9 10 // E creates an error by the provided message and description. Description can be a log structure 11 func E(msg string, description ...interface{}) error { 12 if len(description) == 1 { 13 if err, ok := description[0].(error); ok { 14 return W(err, msg) 15 } 16 } 17 return New(msg, description...) 18 } 19 20 // W wraps the given error with provided message and details. 21 // Returns nil when (err) == nil 22 func W(err error, msg string, description ...interface{}) error { 23 if err == nil { 24 return nil 25 } 26 return WithDetails(err, New(msg, description...)) 27 } 28 29 // R takes recovered panic and previous error if any, then wraps them together with current stack 30 // Returns (prevErr) when (recovered) is nil. 31 // NB! Must be called inside defer, e.g. defer func() { err = R(recover(), err) } () 32 func R(recovered interface{}, prevErr error) error { 33 if recovered == nil { 34 return prevErr 35 } 36 err := WrapPanicExt(recovered, recoverSkipFrames+1) 37 if prevErr == nil { 38 return err 39 } 40 return WithDetails(err, prevErr) 41 } 42 43 // RW takes recovered panic, previous error if any, then wraps them together with current stack and message. 44 // Returns (prevErr) when (recovered) is nil. Description can be a log structure 45 // NB! Must be called inside defer, e.g. defer func() { err = RW(recover(), err, "msg", x) } () 46 func RW(recovered interface{}, prevErr error, msg string, description ...interface{}) error { 47 if recovered == nil { 48 return prevErr 49 } 50 err := WrapPanicExt(recovered, recoverSkipFrames+1) 51 d := New(msg, description...) 52 return WithDetails(err, WithDetails(prevErr, d)) 53 } 54 55 // Rn takes recovered panic and reports it as an error, without a panic mark. Result is wrapped with current stack. 56 // NB! Must be called inside defer, e.g. defer func() { err = Rn(recover(), err) } () 57 func Rn(recovered interface{}, prevErr error) error { 58 if recovered == nil { 59 return prevErr 60 } 61 err := WithStackExt(NewDescription(recovered), recoverSkipFrames+1) 62 return WithDetails(err, prevErr) 63 } 64 65 // Rn takes recovered panic, previous error if any, then wraps them together with current stack and message. But without a panic mark. 66 // NB! Must be called inside defer, e.g. defer func() { err = RWn(recover(), err, "msg", x) } () 67 func RWn(recovered interface{}, prevErr error, msg string, details ...interface{}) error { 68 if recovered == nil { 69 return prevErr 70 } 71 err := WithStackExt(NewDescription(recovered), recoverSkipFrames+1) 72 d := New(msg, details...) 73 return WithDetails(err, WithDetails(prevErr, d)) 74 } 75 76 // deprecated 77 // Wrapf must be replaced with throw.W and struct for details 78 func Wrapf(err error, format string, args ...interface{}) error { 79 if err == nil { 80 return nil 81 } 82 return W(err, fmt.Sprintf(format, args...)) 83 } 84 85 // deprecated 86 // Errorf must be replaced with either throw.New or with fmt.Errorf 87 func Errorf(format string, args ...interface{}) error { 88 return fmt.Errorf(format, args...) 89 }