|
@@ -295,6 +295,30 @@ type isZeroer interface {
|
|
|
IsZero() bool
|
|
IsZero() bool
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+type codecError struct {
|
|
|
|
|
+ name string
|
|
|
|
|
+ err interface{}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (e codecError) Cause() error {
|
|
|
|
|
+ switch xerr := e.err.(type) {
|
|
|
|
|
+ case nil:
|
|
|
|
|
+ return nil
|
|
|
|
|
+ case error:
|
|
|
|
|
+ return xerr
|
|
|
|
|
+ case string:
|
|
|
|
|
+ return errors.New(xerr)
|
|
|
|
|
+ case fmt.Stringer:
|
|
|
|
|
+ return errors.New(xerr.String())
|
|
|
|
|
+ default:
|
|
|
|
|
+ return fmt.Errorf("%v", e.err)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (e codecError) Error() string {
|
|
|
|
|
+ return fmt.Sprintf("%s error: %v", e.name, e.err)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// type byteAccepter func(byte) bool
|
|
// type byteAccepter func(byte) bool
|
|
|
|
|
|
|
|
var (
|
|
var (
|
|
@@ -1597,7 +1621,7 @@ func isEmptyStruct(v reflect.Value, tinfos *TypeInfos, deref, checkStruct bool)
|
|
|
// return t
|
|
// return t
|
|
|
// }
|
|
// }
|
|
|
|
|
|
|
|
-func panicToErr(h errstrDecorator, err *error) {
|
|
|
|
|
|
|
+func panicToErr(h errDecorator, err *error) {
|
|
|
// Note: This method MUST be called directly from defer i.e. defer panicToErr ...
|
|
// Note: This method MUST be called directly from defer i.e. defer panicToErr ...
|
|
|
// else it seems the recover is not fully handled
|
|
// else it seems the recover is not fully handled
|
|
|
if recoverPanicToErr {
|
|
if recoverPanicToErr {
|
|
@@ -1609,7 +1633,7 @@ func panicToErr(h errstrDecorator, err *error) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func panicValToErr(h errstrDecorator, v interface{}, err *error) {
|
|
|
|
|
|
|
+func panicValToErr(h errDecorator, v interface{}, err *error) {
|
|
|
switch xerr := v.(type) {
|
|
switch xerr := v.(type) {
|
|
|
case nil:
|
|
case nil:
|
|
|
case error:
|
|
case error:
|
|
@@ -1619,18 +1643,18 @@ func panicValToErr(h errstrDecorator, v interface{}, err *error) {
|
|
|
// treat as special (bubble up)
|
|
// treat as special (bubble up)
|
|
|
*err = xerr
|
|
*err = xerr
|
|
|
default:
|
|
default:
|
|
|
- h.wrapErrstr(xerr.Error(), err)
|
|
|
|
|
|
|
+ h.wrapErr(xerr, err)
|
|
|
}
|
|
}
|
|
|
case string:
|
|
case string:
|
|
|
if xerr != "" {
|
|
if xerr != "" {
|
|
|
- h.wrapErrstr(xerr, err)
|
|
|
|
|
|
|
+ h.wrapErr(xerr, err)
|
|
|
}
|
|
}
|
|
|
case fmt.Stringer:
|
|
case fmt.Stringer:
|
|
|
if xerr != nil {
|
|
if xerr != nil {
|
|
|
- h.wrapErrstr(xerr.String(), err)
|
|
|
|
|
|
|
+ h.wrapErr(xerr, err)
|
|
|
}
|
|
}
|
|
|
default:
|
|
default:
|
|
|
- h.wrapErrstr(v, err)
|
|
|
|
|
|
|
+ h.wrapErr(v, err)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -2386,13 +2410,13 @@ func (panicHdl) errorf(format string, params ...interface{}) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-type errstrDecorator interface {
|
|
|
|
|
- wrapErrstr(interface{}, *error)
|
|
|
|
|
|
|
+type errDecorator interface {
|
|
|
|
|
+ wrapErr(in interface{}, out *error)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-type errstrDecoratorDef struct{}
|
|
|
|
|
|
|
+type errDecoratorDef struct{}
|
|
|
|
|
|
|
|
-func (errstrDecoratorDef) wrapErrstr(v interface{}, e *error) { *e = fmt.Errorf("%v", v) }
|
|
|
|
|
|
|
+func (errDecoratorDef) wrapErr(v interface{}, e *error) { *e = fmt.Errorf("%v", v) }
|
|
|
|
|
|
|
|
type must struct{}
|
|
type must struct{}
|
|
|
|
|
|