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 }