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  }