diff options
author | Andrew Gerrand <adg@golang.org> | 2010-04-01 11:19:37 +1100 |
---|---|---|
committer | Andrew Gerrand <adg@golang.org> | 2010-04-01 11:19:37 +1100 |
commit | 951e3261d4cdff774025ed472991349595169f12 (patch) | |
tree | 19af0efb2cdbaaa0ccca4c8b407e70f7ea646fee | |
parent | 77bcd3a62b91c5a73daba61be5d9ff4a3e6f1484 (diff) | |
download | golang-951e3261d4cdff774025ed472991349595169f12.tar.gz |
json: use panic/recover to handle errors in Marshal
R=r, gri
CC=golang-dev
http://codereview.appspot.com/872041
-rw-r--r-- | src/pkg/json/struct.go | 57 |
1 files changed, 21 insertions, 36 deletions
diff --git a/src/pkg/json/struct.go b/src/pkg/json/struct.go index 46f04146d..b89ef29a8 100644 --- a/src/pkg/json/struct.go +++ b/src/pkg/json/struct.go @@ -346,29 +346,24 @@ func (s *writeState) writeIndent() { } } -func (s *writeState) writeArrayOrSlice(val reflect.ArrayOrSliceValue) (err os.Error) { +func (s *writeState) writeArrayOrSlice(val reflect.ArrayOrSliceValue) { s.descend('[') for i := 0; i < val.Len(); i++ { s.writeIndent() - - if err = s.writeValue(val.Elem(i)); err != nil { - return - } - + s.writeValue(val.Elem(i)) if i < val.Len()-1 { s.WriteByte(',') } } s.ascend(']') - return } -func (s *writeState) writeMap(val *reflect.MapValue) (err os.Error) { +func (s *writeState) writeMap(val *reflect.MapValue) { key := val.Type().(*reflect.MapType).Key() if _, ok := key.(*reflect.StringType); !ok { - return &MarshalError{val.Type()} + panic(&MarshalError{val.Type()}) } s.descend('{') @@ -376,45 +371,34 @@ func (s *writeState) writeMap(val *reflect.MapValue) (err os.Error) { keys := val.Keys() for i := 0; i < len(keys); i++ { s.writeIndent() - fmt.Fprintf(s, "%s:", Quote(keys[i].(*reflect.StringValue).Get())) - - if err = s.writeValue(val.Elem(keys[i])); err != nil { - return - } - + s.writeValue(val.Elem(keys[i])) if i < len(keys)-1 { s.WriteByte(',') } } s.ascend('}') - return } -func (s *writeState) writeStruct(val *reflect.StructValue) (err os.Error) { +func (s *writeState) writeStruct(val *reflect.StructValue) { s.descend('{') typ := val.Type().(*reflect.StructType) for i := 0; i < val.NumField(); i++ { s.writeIndent() - - fieldValue := val.Field(i) fmt.Fprintf(s, "%s:", Quote(typ.Field(i).Name)) - if err = s.writeValue(fieldValue); err != nil { - return - } + s.writeValue(val.Field(i)) if i < val.NumField()-1 { s.WriteByte(',') } } s.ascend('}') - return } -func (s *writeState) writeValue(val reflect.Value) (err os.Error) { +func (s *writeState) writeValue(val reflect.Value) { if val == nil { fmt.Fprint(s, "null") return @@ -424,28 +408,28 @@ func (s *writeState) writeValue(val reflect.Value) (err os.Error) { case *reflect.StringValue: fmt.Fprint(s, Quote(v.Get())) case *reflect.ArrayValue: - err = s.writeArrayOrSlice(v) + s.writeArrayOrSlice(v) case *reflect.SliceValue: - err = s.writeArrayOrSlice(v) + s.writeArrayOrSlice(v) case *reflect.MapValue: - err = s.writeMap(v) + s.writeMap(v) case *reflect.StructValue: - err = s.writeStruct(v) + s.writeStruct(v) case *reflect.ChanValue, *reflect.UnsafePointerValue, *reflect.FuncValue: - err = &MarshalError{val.Type()} + panic(&MarshalError{val.Type()}) case *reflect.InterfaceValue: if v.IsNil() { fmt.Fprint(s, "null") } else { - err = s.writeValue(v.Elem()) + s.writeValue(v.Elem()) } case *reflect.PtrValue: if v.IsNil() { fmt.Fprint(s, "null") } else { - err = s.writeValue(v.Elem()) + s.writeValue(v.Elem()) } case *reflect.UintptrValue: fmt.Fprintf(s, "%d", v.Get()) @@ -461,14 +445,15 @@ func (s *writeState) writeValue(val reflect.Value) (err os.Error) { value := val.(reflect.Value) fmt.Fprintf(s, "%#v", value.Interface()) } - return } func (s *writeState) marshal(w io.Writer, val interface{}) (err os.Error) { - err = s.writeValue(reflect.NewValue(val)) - if err != nil { - return - } + defer func() { + if e := recover(); e != nil { + err = e.(*MarshalError) + } + }() + s.writeValue(reflect.NewValue(val)) if s.newlines { s.WriteByte('\n') } |