github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/runc/libcontainer/generic_error.go (about)

     1  package libcontainer
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"text/template"
     7  	"time"
     8  
     9  	"github.com/opencontainers/runc/libcontainer/stacktrace"
    10  )
    11  
    12  type syncType uint8
    13  
    14  const (
    15  	procReady syncType = iota
    16  	procError
    17  	procRun
    18  	procHooks
    19  	procResume
    20  )
    21  
    22  type syncT struct {
    23  	Type syncType `json:"type"`
    24  }
    25  
    26  var errorTemplate = template.Must(template.New("error").Parse(`Timestamp: {{.Timestamp}}
    27  Code: {{.ECode}}
    28  {{if .Message }}
    29  Message: {{.Message}}
    30  {{end}}
    31  Frames:{{range $i, $frame := .Stack.Frames}}
    32  ---
    33  {{$i}}: {{$frame.Function}}
    34  Package: {{$frame.Package}}
    35  File: {{$frame.File}}@{{$frame.Line}}{{end}}
    36  `))
    37  
    38  func newGenericError(err error, c ErrorCode) Error {
    39  	if le, ok := err.(Error); ok {
    40  		return le
    41  	}
    42  	gerr := &genericError{
    43  		Timestamp: time.Now(),
    44  		Err:       err,
    45  		ECode:     c,
    46  		Stack:     stacktrace.Capture(1),
    47  	}
    48  	if err != nil {
    49  		gerr.Message = err.Error()
    50  	}
    51  	return gerr
    52  }
    53  
    54  func newSystemError(err error) Error {
    55  	return createSystemError(err, "")
    56  }
    57  
    58  func newSystemErrorWithCausef(err error, cause string, v ...interface{}) Error {
    59  	return createSystemError(err, fmt.Sprintf(cause, v...))
    60  }
    61  
    62  func newSystemErrorWithCause(err error, cause string) Error {
    63  	return createSystemError(err, cause)
    64  }
    65  
    66  // createSystemError creates the specified error with the correct number of
    67  // stack frames skipped. This is only to be called by the other functions for
    68  // formatting the error.
    69  func createSystemError(err error, cause string) Error {
    70  	gerr := &genericError{
    71  		Timestamp: time.Now(),
    72  		Err:       err,
    73  		ECode:     SystemError,
    74  		Cause:     cause,
    75  		Stack:     stacktrace.Capture(2),
    76  	}
    77  	if err != nil {
    78  		gerr.Message = err.Error()
    79  	}
    80  	return gerr
    81  }
    82  
    83  type genericError struct {
    84  	Timestamp time.Time
    85  	ECode     ErrorCode
    86  	Err       error `json:"-"`
    87  	Cause     string
    88  	Message   string
    89  	Stack     stacktrace.Stacktrace
    90  }
    91  
    92  func (e *genericError) Error() string {
    93  	if e.Cause == "" {
    94  		return e.Message
    95  	}
    96  	frame := e.Stack.Frames[0]
    97  	return fmt.Sprintf("%s:%d: %s caused %q", frame.File, frame.Line, e.Cause, e.Message)
    98  }
    99  
   100  func (e *genericError) Code() ErrorCode {
   101  	return e.ECode
   102  }
   103  
   104  func (e *genericError) Detail(w io.Writer) error {
   105  	return errorTemplate.Execute(w, e)
   106  }