From 79ce89b0e9ca1494e096e5a8a9dd81a85defb59e Mon Sep 17 00:00:00 2001 From: Tim Hockin Date: Fri, 21 Jan 2022 11:07:26 -0800 Subject: [PATCH] Alt: swallow all panics --- funcr/funcr.go | 35 ++++++----------------------------- funcr/funcr_test.go | 38 +++++++++++--------------------------- 2 files changed, 17 insertions(+), 56 deletions(-) diff --git a/funcr/funcr.go b/funcr/funcr.go index c66b731..3c72929 100644 --- a/funcr/funcr.go +++ b/funcr/funcr.go @@ -598,12 +598,8 @@ func isEmpty(v reflect.Value) bool { func invokeMarshaler(m logr.Marshaler) (ret interface{}) { defer func() { - if err := recover(); err != nil { - if isNil(m) { - ret = "" - } else { - panic(err) - } + if r := recover(); r != nil { + ret = fmt.Sprintf("", r) } }() return m.MarshalLog() @@ -611,12 +607,8 @@ func invokeMarshaler(m logr.Marshaler) (ret interface{}) { func invokeStringer(s fmt.Stringer) (ret string) { defer func() { - if err := recover(); err != nil { - if isNil(s) { - ret = "" - } else { - panic(err) - } + if r := recover(); r != nil { + ret = fmt.Sprintf("", r) } }() return s.String() @@ -624,28 +616,13 @@ func invokeStringer(s fmt.Stringer) (ret string) { func invokeError(e error) (ret string) { defer func() { - if isNil(e) { - if err := recover(); err != nil { - ret = "" - } else { - panic(err) - } + if r := recover(); r != nil { + ret = fmt.Sprintf("", r) } }() return e.Error() } -func isNil(i interface{}) bool { - if i == nil { - return true - } - switch reflect.TypeOf(i).Kind() { - case reflect.Ptr, reflect.Map, reflect.Array, reflect.Chan, reflect.Slice: - return reflect.ValueOf(i).IsNil() - } - return false -} - // Caller represents the original call site for a log line, after considering // logr.Logger.WithCallDepth and logr.Logger.WithCallStackHelper. The File and // Line fields will always be provided, while the Func field is optional. diff --git a/funcr/funcr_test.go b/funcr/funcr_test.go index c641381..8693810 100644 --- a/funcr/funcr_test.go +++ b/funcr/funcr_test.go @@ -237,9 +237,8 @@ func TestPretty(t *testing.T) { } cases := []struct { - val interface{} - exp string // used in cases where JSON can't handle it - pmsg string // used to test panic cases + val interface{} + exp string // used in cases where JSON can't handle it }{ {val: "strval"}, {val: "strval\nwith\t\"escapes\""}, @@ -389,11 +388,11 @@ func TestPretty(t *testing.T) { }, { val: (*Tmarshaler)(nil), - exp: `""`, + exp: `""`, }, { - val: Tmarshalerpanic{"foobar"}, - pmsg: "Tmarshalerpanic", + val: Tmarshalerpanic{"foobar"}, + exp: `""`, }, { val: Tstringer{"foobar"}, @@ -405,11 +404,11 @@ func TestPretty(t *testing.T) { }, { val: (*Tstringer)(nil), - exp: `""`, + exp: `""`, }, { - val: Tstringerpanic{"foobar"}, - pmsg: "Tstringerpanic", + val: Tstringerpanic{"foobar"}, + exp: `""`, }, { val: Terror{"foobar"}, @@ -421,11 +420,11 @@ func TestPretty(t *testing.T) { }, { val: (*Terror)(nil), - exp: `""`, + exp: `""`, }, { - val: Terrorpanic{"foobar"}, - pmsg: "Terrorpanic", + val: Terrorpanic{"foobar"}, + exp: `""`, }, { val: TjsontagsString{ @@ -579,21 +578,6 @@ func TestPretty(t *testing.T) { f := NewFormatter(Options{}) for i, tc := range cases { - // Handle cases that are supposed to panic. - if tc.pmsg != "" { - func() { - defer func() { - r := recover() - if r == nil { - t.Errorf("[%d]: expected panic(%q)", i, tc.pmsg) - } else if fmt.Sprintf("%v", r) != tc.pmsg { - t.Errorf("[%d]: expected panic(%q), got %q", i, tc.pmsg, r) - } - }() - _ = f.pretty(tc.val) - }() - continue - } ours := f.pretty(tc.val) want := "" if tc.exp != "" {