Source File
error.go
Belonging Package
go.uber.org/zap/zapcore
// Copyright (c) 2017 Uber Technologies, Inc.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to deal// in the Software without restriction, including without limitation the rights// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell// copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions://// The above copyright notice and this permission notice shall be included in// all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN// THE SOFTWARE.package zapcoreimport ()// Encodes the given error into fields of an object. A field with the given// name is added for the error message.//// If the error implements fmt.Formatter, a field with the name ${key}Verbose// is also added with the full verbose error message.//// Finally, if the error implements errorGroup (from go.uber.org/multierr) or// causer (from github.com/pkg/errors), a ${key}Causes field is added with an// array of objects containing the errors this error was comprised of.//// {// "error": err.Error(),// "errorVerbose": fmt.Sprintf("%+v", err),// "errorCauses": [// ...// ],// }func ( string, error, ObjectEncoder) ( error) {// Try to capture panics (from nil references or otherwise) when calling// the Error() methoddefer func() {if := recover(); != nil {// If it's a nil pointer, just say "<nil>". The likeliest causes are a// error that fails to guard against nil or a nil pointer for a// value receiver, and in either case, "<nil>" is a nice result.if := reflect.ValueOf(); .Kind() == reflect.Ptr && .IsNil() {.AddString(, "<nil>")return}= fmt.Errorf("PANIC=%v", )}}():= .Error().AddString(, )switch e := .(type) {case errorGroup:return .AddArray(+"Causes", errArray(.Errors()))case fmt.Formatter::= fmt.Sprintf("%+v", )if != {// This is a rich error type, like those produced by// github.com/pkg/errors..AddString(+"Verbose", )}}return nil}type errorGroup interface {// Provides read-only access to the underlying list of errors, preferably// without causing any allocs.Errors() []error}// Note that errArray and errArrayElem are very similar to the version// implemented in the top-level error.go file. We can't re-use this because// that would require exporting errArray as part of the zapcore API.// Encodes a list of errors using the standard error encoding logic.type errArray []errorfunc ( errArray) ( ArrayEncoder) error {for := range {if [] == nil {continue}:= newErrArrayElem([]):= .AppendObject().Free()if != nil {return}}return nil}var _errArrayElemPool = pool.New(func() *errArrayElem {return &errArrayElem{}})// Encodes any error into a {"error": ...} re-using the same errors logic.//// May be passed in place of an array to build a single-element array.type errArrayElem struct{ err error }func ( error) *errArrayElem {:= _errArrayElemPool.Get().err =return}func ( *errArrayElem) ( ArrayEncoder) error {return .AppendObject()}func ( *errArrayElem) ( ObjectEncoder) error {return encodeError("error", .err, )}func ( *errArrayElem) () {.err = nil_errArrayElemPool.Put()}
![]() |
The pages are generated with Golds v0.6.7. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |