X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=codec%2Fmsg_codec.go;h=3f60cae34173ffe1313913f2c0e51f0d99daff47;hb=280b1c6c83b676ef4e592f4ecf60cb5b54b6a753;hp=67628a4d555e69702f4950ff9d4bda6cdf3283ee;hpb=f049390060630c0085fe4ad683c83a4a14a47ffb;p=govpp.git diff --git a/codec/msg_codec.go b/codec/msg_codec.go index 67628a4..3f60cae 100644 --- a/codec/msg_codec.go +++ b/codec/msg_codec.go @@ -20,8 +20,9 @@ import ( "fmt" "reflect" - "git.fd.io/govpp.git/api" "github.com/lunixbochs/struc" + + "git.fd.io/govpp.git/api" ) // MsgCodec provides encoding and decoding functionality of `api.Message` structs into/from @@ -65,7 +66,7 @@ func (*MsgCodec) EncodeMsg(msg api.Message, msgID uint16) (data []byte, err erro if err, ok = r.(error); !ok { err = fmt.Errorf("%v", r) } - err = fmt.Errorf("panic occurred: %v", err) + err = fmt.Errorf("panic occurred during encoding message %s: %v", msg.GetMessageName(), err) } }() @@ -101,11 +102,22 @@ func (*MsgCodec) EncodeMsg(msg api.Message, msgID uint16) (data []byte, err erro } // DecodeMsg decodes binary-encoded data of a message into provided `Message` structure. -func (*MsgCodec) DecodeMsg(data []byte, msg api.Message) error { +func (*MsgCodec) DecodeMsg(data []byte, msg api.Message) (err error) { if msg == nil { return errors.New("nil message passed in") } + // try to recover panic which might possibly occur + defer func() { + if r := recover(); r != nil { + var ok bool + if err, ok = r.(error); !ok { + err = fmt.Errorf("%v", r) + } + err = fmt.Errorf("panic occurred during decoding message %s: %v", msg.GetMessageName(), err) + } + }() + var header interface{} // check which header is expected @@ -123,7 +135,7 @@ func (*MsgCodec) DecodeMsg(data []byte, msg api.Message) error { buf := bytes.NewReader(data) // decode message header - if err := struc.Unpack(buf, header); err != nil { + if err = struc.Unpack(buf, header); err != nil { return fmt.Errorf("failed to decode message header: %+v, error: %v", header, err) }