diff --git a/g/crypto/gmd5/gmd5.go b/g/crypto/gmd5/gmd5.go index a4829e97a..26888db0a 100644 --- a/g/crypto/gmd5/gmd5.go +++ b/g/crypto/gmd5/gmd5.go @@ -9,7 +9,6 @@ package gmd5 import ( "crypto/md5" - "errors" "fmt" "io" "os" @@ -40,9 +39,7 @@ func EncryptFile(path string) (encrypt string, err error) { return "", err } defer func() { - if e := f.Close(); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(f.Close(), "file closing error") }() h := md5.New() _, err = io.Copy(h, f) diff --git a/g/crypto/gsha1/gsha1.go b/g/crypto/gsha1/gsha1.go index b296bdb74..e38a8299c 100644 --- a/g/crypto/gsha1/gsha1.go +++ b/g/crypto/gsha1/gsha1.go @@ -10,10 +10,10 @@ package gsha1 import ( "crypto/sha1" "encoding/hex" - "errors" "io" "os" + "github.com/gogf/gf/g/internal/errors" "github.com/gogf/gf/g/util/gconv" ) @@ -37,9 +37,7 @@ func EncryptFile(path string) (encrypt string, err error) { return "", err } defer func() { - if e := f.Close(); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(f.Close(), "file closing error") }() h := sha1.New() _, err = io.Copy(h, f) diff --git a/g/internal/errors/errors.go b/g/internal/errors/errors.go new file mode 100644 index 000000000..7d6270869 --- /dev/null +++ b/g/internal/errors/errors.go @@ -0,0 +1,48 @@ +// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +// Package errors provides simple functions to manipulate errors. +// +// This package can be scalable due to https://go.googlesource.com/proposal/+/master/design/go2draft.md. +package errors + +import "github.com/gogf/gf/g/util/gconv" + +// errorWrapper is a simple wrapper for errors. +type errorWrapper struct { + s string +} + +// New returns an error that formats as the given value. +func New(value interface{}) error { + if value == nil { + return nil + } + return NewText(gconv.String(value)) +} + +// NewText returns an error that formats as the given text. +func NewText(text string) error { + if text == "" { + return nil + } + return &errorWrapper{ + s: text, + } +} + +// Wrap wraps error with text. +func Wrap(err error, text string) error { + if err == nil { + return nil + } + return NewText(text + ": " + err.Error()) +} + +// Error implements interface Error. +func (e *errorWrapper) Error() string { + return e.s +} diff --git a/g/internal/errors/errors_test.go b/g/internal/errors/errors_test.go new file mode 100644 index 000000000..7d0328baa --- /dev/null +++ b/g/internal/errors/errors_test.go @@ -0,0 +1,39 @@ +// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package errors_test + +import ( + "testing" + + "github.com/gogf/gf/g/internal/errors" + "github.com/gogf/gf/g/test/gtest" +) + +func interfaceNil() interface{} { + return nil +} + +func nilError() error { + return nil +} + +func Test_Nil(t *testing.T) { + gtest.Case(t, func() { + gtest.Assert(errors.New(interfaceNil()), nil) + gtest.Assert(errors.Wrap(nilError(), "test"), nil) + }) +} + +func Test_Wrap(t *testing.T) { + gtest.Case(t, func() { + err := errors.New("1") + err = errors.Wrap(err, "func2 error") + err = errors.Wrap(err, "func3 error") + gtest.AssertNE(err, nil) + gtest.Assert(err.Error(), "func3 error: func2 error: 1") + }) +} diff --git a/g/net/gtcp/gtcp_conn.go b/g/net/gtcp/gtcp_conn.go index f1ace01e9..43ee80ec3 100644 --- a/g/net/gtcp/gtcp_conn.go +++ b/g/net/gtcp/gtcp_conn.go @@ -10,10 +10,11 @@ import ( "bufio" "bytes" "crypto/tls" - "errors" "io" "net" "time" + + "github.com/gogf/gf/g/internal/errors" ) // 封装的链接对象 @@ -208,9 +209,7 @@ func (c *Conn) RecvWithTimeout(length int, timeout time.Duration, retry ...Retry return nil, err } defer func() { - if e := c.SetRecvDeadline(time.Time{}); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(c.SetRecvDeadline(time.Time{}), "SetRecvDeadline error") }() data, err = c.Recv(length, retry...) return @@ -222,9 +221,7 @@ func (c *Conn) SendWithTimeout(data []byte, timeout time.Duration, retry ...Retr return err } defer func() { - if e := c.SetSendDeadline(time.Time{}); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(c.SetSendDeadline(time.Time{}), "SetSendDeadline error") }() err = c.Send(data, retry...) return diff --git a/g/net/gtcp/gtcp_conn_pkg.go b/g/net/gtcp/gtcp_conn_pkg.go index 0bc114a50..90b02ca97 100644 --- a/g/net/gtcp/gtcp_conn_pkg.go +++ b/g/net/gtcp/gtcp_conn_pkg.go @@ -8,9 +8,10 @@ package gtcp import ( "encoding/binary" - "errors" "fmt" "time" + + "github.com/gogf/gf/g/internal/errors" ) const ( @@ -73,9 +74,7 @@ func (c *Conn) SendPkgWithTimeout(data []byte, timeout time.Duration, option ... return err } defer func() { - if e := c.SetSendDeadline(time.Time{}); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(c.SetSendDeadline(time.Time{}), "SetSendDeadline error") }() err = c.SendPkg(data, option...) return @@ -148,9 +147,7 @@ func (c *Conn) RecvPkgWithTimeout(timeout time.Duration, option ...PkgOption) (d return nil, err } defer func() { - if e := c.SetRecvDeadline(time.Time{}); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(c.SetRecvDeadline(time.Time{}), "SetRecvDeadline error") }() data, err = c.RecvPkg(option...) return diff --git a/g/net/gtcp/gtcp_pool.go b/g/net/gtcp/gtcp_pool.go index ee65f0f61..ec706e344 100644 --- a/g/net/gtcp/gtcp_pool.go +++ b/g/net/gtcp/gtcp_pool.go @@ -7,9 +7,10 @@ package gtcp import ( - "errors" "time" + "github.com/gogf/gf/g/internal/errors" + "github.com/gogf/gf/g/container/gmap" "github.com/gogf/gf/g/container/gpool" ) @@ -121,9 +122,7 @@ func (c *PoolConn) RecvWithTimeout(length int, timeout time.Duration, retry ...R return nil, err } defer func() { - if e := c.SetRecvDeadline(time.Time{}); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(c.SetRecvDeadline(time.Time{}), "SetRecvDeadline error") }() data, err = c.Recv(length, retry...) return @@ -135,9 +134,7 @@ func (c *PoolConn) SendWithTimeout(data []byte, timeout time.Duration, retry ... return err } defer func() { - if e := c.SetSendDeadline(time.Time{}); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(c.SetSendDeadline(time.Time{}), "SetSendDeadline error") }() err = c.Send(data, retry...) return diff --git a/g/net/gtcp/gtcp_pool_pkg.go b/g/net/gtcp/gtcp_pool_pkg.go index 6b71eea0d..03a182de6 100644 --- a/g/net/gtcp/gtcp_pool_pkg.go +++ b/g/net/gtcp/gtcp_pool_pkg.go @@ -7,8 +7,9 @@ package gtcp import ( - "errors" "time" + + "github.com/gogf/gf/g/internal/errors" ) // 简单协议: (方法覆盖)发送数据 @@ -46,9 +47,7 @@ func (c *PoolConn) RecvPkgWithTimeout(timeout time.Duration, option ...PkgOption return nil, err } defer func() { - if e := c.SetRecvDeadline(time.Time{}); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(c.SetRecvDeadline(time.Time{}), "SetRecvDeadline error") }() data, err = c.RecvPkg(option...) return @@ -60,9 +59,7 @@ func (c *PoolConn) SendPkgWithTimeout(data []byte, timeout time.Duration, option return err } defer func() { - if e := c.SetSendDeadline(time.Time{}); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(c.SetSendDeadline(time.Time{}), "SetSendDeadline error") }() err = c.SendPkg(data, option...) return diff --git a/g/net/gudp/gudp_conn.go b/g/net/gudp/gudp_conn.go index 1d59791f9..2e6c9fdf0 100644 --- a/g/net/gudp/gudp_conn.go +++ b/g/net/gudp/gudp_conn.go @@ -7,10 +7,11 @@ package gudp import ( - "errors" "io" "net" "time" + + "github.com/gogf/gf/g/internal/errors" ) // 封装的UDP链接对象 @@ -181,9 +182,7 @@ func (c *Conn) RecvWithTimeout(length int, timeout time.Duration, retry ...Retry return nil, err } defer func() { - if e := c.SetRecvDeadline(time.Time{}); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(c.SetRecvDeadline(time.Time{}), "SetRecvDeadline error") }() data, err = c.Recv(length, retry...) return @@ -195,9 +194,7 @@ func (c *Conn) SendWithTimeout(data []byte, timeout time.Duration, retry ...Retr return err } defer func() { - if e := c.SetSendDeadline(time.Time{}); e != nil { - err = errors.New(err.Error() + "; " + e.Error()) - } + err = errors.Wrap(c.SetSendDeadline(time.Time{}), "SetSendDeadline error") }() err = c.Send(data, retry...) return diff --git a/geg/other/test.go b/geg/other/test.go index d856ff4b0..790580777 100644 --- a/geg/other/test.go +++ b/geg/other/test.go @@ -1,51 +1,5 @@ package main -import ( - "fmt" - - "github.com/gogf/gf/g/encoding/gjson" - "github.com/gogf/gf/g/util/gconv" -) - -//type TemplateMessage struct { -// Touser string `json:"touser,omitempty"` -// TemplateId string `json:"template_id,omitempty"` -// Miniprogram interface{} `json:"miniprograme,omitempty"` -// Data interface{} `json:"data,omitempty"` -//} - -type TemplateMessage struct { - Touser string `json:"touser,omitempty"` - TemplateId string `json:"template_id,omitempty"` - Miniprogram *gjson.Json `json:"miniprograme,omitempty"` - Data *gjson.Json `json:"data,omitempty"` -} - -// 封装模版消息 -func getTemplateMessage(message string) string { - templateId := "22222222" - miniprogram := `{"appid":"111111111","pagepath":"pages\/index?ald_media_id=20962&ald_link_key=bd660b4962a599f2"}` - data := `{"first":{"value":"送您一个随机红包,点击领取¥0.3-¥10","color":"#FF0000"},"keyword1":{"value":"¥0.3-¥10"},"keyword2":{"value":"2019年06月19日 11:45"},"keyword3":{"value":"微信零钱"},"keyword4":{"value":"点击此消息即可提现","color":"#FF0000"}}` - miniprogramJson := gjson.New(miniprogram) - dataJson := gjson.New(data) - //glog.Infof(miniprogramJson.ToJsonString()) - //glog.Info(dataJson.ToJsonString()) - - templateMessage := TemplateMessage{ - Touser: message, - TemplateId: templateId, - Miniprogram: miniprogramJson, - Data: dataJson, - } - - //glog.Debug(dataJson.ToJsonString()) - //json, _ := gjson.New(templateMessage).ToJsonString() - //return json - //glog.Info(templateMessage.Miniprogram.ToJsonString()) - return gconv.String(templateMessage) -} - func main() { - fmt.Println(getTemplateMessage("test")) } diff --git a/go.mod b/go.mod index fd3232e72..ef37cb8d6 100644 --- a/go.mod +++ b/go.mod @@ -1 +1 @@ -module github.com/gogf/gf \ No newline at end of file +module github.com/gogf/gf