diff --git a/container/garray/garray_normal_any.go b/container/garray/garray_normal_any.go index a3b450b54..a87cb8b41 100644 --- a/container/garray/garray_normal_any.go +++ b/container/garray/garray_normal_any.go @@ -123,7 +123,7 @@ func (a *Array) Set(index int, value interface{}) error { a.mu.Lock() defer a.mu.Unlock() if index < 0 || index >= len(a.array) { - return gerror.Newf("index %d out of array range %d", index, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array)) } a.array[index] = value return nil @@ -176,7 +176,7 @@ func (a *Array) InsertBefore(index int, value interface{}) error { a.mu.Lock() defer a.mu.Unlock() if index < 0 || index >= len(a.array) { - return gerror.Newf("index %d out of array range %d", index, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array)) } rear := append([]interface{}{}, a.array[index:]...) a.array = append(a.array[0:index], value) @@ -189,7 +189,7 @@ func (a *Array) InsertAfter(index int, value interface{}) error { a.mu.Lock() defer a.mu.Unlock() if index < 0 || index >= len(a.array) { - return gerror.Newf("index %d out of array range %d", index, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array)) } rear := append([]interface{}{}, a.array[index+1:]...) a.array = append(a.array[0:index+1], value) @@ -545,7 +545,7 @@ func (a *Array) Fill(startIndex int, num int, value interface{}) error { a.mu.Lock() defer a.mu.Unlock() if startIndex < 0 || startIndex > len(a.array) { - return gerror.Newf("index %d out of array range %d", startIndex, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", startIndex, len(a.array)) } for i := startIndex; i < startIndex+num; i++ { if i > len(a.array)-1 { diff --git a/container/garray/garray_normal_int.go b/container/garray/garray_normal_int.go index 3e43a56db..c58020eb2 100644 --- a/container/garray/garray_normal_int.go +++ b/container/garray/garray_normal_int.go @@ -104,7 +104,7 @@ func (a *IntArray) Set(index int, value int) error { a.mu.Lock() defer a.mu.Unlock() if index < 0 || index >= len(a.array) { - return gerror.Newf("index %d out of array range %d", index, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array)) } a.array[index] = value return nil @@ -175,7 +175,7 @@ func (a *IntArray) InsertBefore(index int, value int) error { a.mu.Lock() defer a.mu.Unlock() if index < 0 || index >= len(a.array) { - return gerror.Newf("index %d out of array range %d", index, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array)) } rear := append([]int{}, a.array[index:]...) a.array = append(a.array[0:index], value) @@ -188,7 +188,7 @@ func (a *IntArray) InsertAfter(index int, value int) error { a.mu.Lock() defer a.mu.Unlock() if index < 0 || index >= len(a.array) { - return gerror.Newf("index %d out of array range %d", index, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array)) } rear := append([]int{}, a.array[index+1:]...) a.array = append(a.array[0:index+1], value) @@ -559,7 +559,7 @@ func (a *IntArray) Fill(startIndex int, num int, value int) error { a.mu.Lock() defer a.mu.Unlock() if startIndex < 0 || startIndex > len(a.array) { - return gerror.Newf("index %d out of array range %d", startIndex, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", startIndex, len(a.array)) } for i := startIndex; i < startIndex+num; i++ { if i > len(a.array)-1 { diff --git a/container/garray/garray_normal_str.go b/container/garray/garray_normal_str.go index 832a70cb6..be23bba9d 100644 --- a/container/garray/garray_normal_str.go +++ b/container/garray/garray_normal_str.go @@ -90,7 +90,7 @@ func (a *StrArray) Set(index int, value string) error { a.mu.Lock() defer a.mu.Unlock() if index < 0 || index >= len(a.array) { - return gerror.Newf("index %d out of array range %d", index, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array)) } a.array[index] = value return nil @@ -162,7 +162,7 @@ func (a *StrArray) InsertBefore(index int, value string) error { a.mu.Lock() defer a.mu.Unlock() if index < 0 || index >= len(a.array) { - return gerror.Newf("index %d out of array range %d", index, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array)) } rear := append([]string{}, a.array[index:]...) a.array = append(a.array[0:index], value) @@ -175,7 +175,7 @@ func (a *StrArray) InsertAfter(index int, value string) error { a.mu.Lock() defer a.mu.Unlock() if index < 0 || index >= len(a.array) { - return gerror.Newf("index %d out of array range %d", index, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array)) } rear := append([]string{}, a.array[index+1:]...) a.array = append(a.array[0:index+1], value) @@ -562,7 +562,7 @@ func (a *StrArray) Fill(startIndex int, num int, value string) error { a.mu.Lock() defer a.mu.Unlock() if startIndex < 0 || startIndex > len(a.array) { - return gerror.Newf("index %d out of array range %d", startIndex, len(a.array)) + return gerror.NewCodef(gerror.CodeInvalidParameter, "index %d out of array range %d", startIndex, len(a.array)) } for i := startIndex; i < startIndex+num; i++ { if i > len(a.array)-1 { diff --git a/container/gpool/gpool.go b/container/gpool/gpool.go index e4125aaac..0022cfb28 100644 --- a/container/gpool/gpool.go +++ b/container/gpool/gpool.go @@ -66,7 +66,7 @@ func New(ttl time.Duration, newFunc NewFunc, expireFunc ...ExpireFunc) *Pool { // Put puts an item to pool. func (p *Pool) Put(value interface{}) error { if p.closed.Val() { - return gerror.New("pool is closed") + return gerror.NewCode(gerror.CodeInvalidOperation, "pool is closed") } item := &poolItem{ value: value, @@ -117,7 +117,7 @@ func (p *Pool) Get() (interface{}, error) { if p.NewFunc != nil { return p.NewFunc() } - return nil, gerror.New("pool is empty") + return nil, gerror.NewCode(gerror.CodeInvalidOperation, "pool is empty") } // Size returns the count of available items of pool. diff --git a/crypto/gaes/gaes.go b/crypto/gaes/gaes.go index bdb04d78a..2fba47c19 100644 --- a/crypto/gaes/gaes.go +++ b/crypto/gaes/gaes.go @@ -63,7 +63,7 @@ func DecryptCBC(cipherText []byte, key []byte, iv ...[]byte) ([]byte, error) { } blockSize := block.BlockSize() if len(cipherText) < blockSize { - return nil, gerror.New("cipherText too short") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "cipherText too short") } ivValue := ([]byte)(nil) if len(iv) > 0 { @@ -72,7 +72,7 @@ func DecryptCBC(cipherText []byte, key []byte, iv ...[]byte) ([]byte, error) { ivValue = []byte(IVDefaultValue) } if len(cipherText)%blockSize != 0 { - return nil, gerror.New("cipherText is not a multiple of the block size") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "cipherText is not a multiple of the block size") } blockModel := cipher.NewCBCDecrypter(block, ivValue) plainText := make([]byte, len(cipherText)) @@ -93,22 +93,22 @@ func PKCS5Padding(src []byte, blockSize int) []byte { func PKCS5UnPadding(src []byte, blockSize int) ([]byte, error) { length := len(src) if blockSize <= 0 { - return nil, gerror.New("invalid blocklen") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "invalid blocklen") } if length%blockSize != 0 || length == 0 { - return nil, gerror.New("invalid data len") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "invalid data len") } unpadding := int(src[length-1]) if unpadding > blockSize || unpadding == 0 { - return nil, gerror.New("invalid padding") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "invalid padding") } padding := src[length-unpadding:] for i := 0; i < unpadding; i++ { if padding[i] != byte(unpadding) { - return nil, gerror.New("invalid padding") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "invalid padding") } } @@ -146,7 +146,7 @@ func DecryptCFB(cipherText []byte, key []byte, unPadding int, iv ...[]byte) ([]b return nil, err } if len(cipherText) < aes.BlockSize { - return nil, gerror.New("cipherText too short") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "cipherText too short") } ivValue := ([]byte)(nil) if len(iv) > 0 { diff --git a/crypto/gdes/gdes.go b/crypto/gdes/gdes.go index c60f7c190..e12113719 100644 --- a/crypto/gdes/gdes.go +++ b/crypto/gdes/gdes.go @@ -66,7 +66,7 @@ func DecryptECB(cipherText []byte, key []byte, padding int) ([]byte, error) { // The length of the should be either 16 or 24 bytes. func EncryptECBTriple(plainText []byte, key []byte, padding int) ([]byte, error) { if len(key) != 16 && len(key) != 24 { - return nil, gerror.New("key length error") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "key length error") } text, err := Padding(plainText, padding) @@ -100,7 +100,7 @@ func EncryptECBTriple(plainText []byte, key []byte, padding int) ([]byte, error) // The length of the should be either 16 or 24 bytes. func DecryptECBTriple(cipherText []byte, key []byte, padding int) ([]byte, error) { if len(key) != 16 && len(key) != 24 { - return nil, gerror.New("key length error") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "key length error") } var newKey []byte @@ -138,7 +138,7 @@ func EncryptCBC(plainText []byte, key []byte, iv []byte, padding int) ([]byte, e } if len(iv) != block.BlockSize() { - return nil, gerror.New("iv length invalid") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "iv length invalid") } text, err := Padding(plainText, padding) @@ -161,7 +161,7 @@ func DecryptCBC(cipherText []byte, key []byte, iv []byte, padding int) ([]byte, } if len(iv) != block.BlockSize() { - return nil, gerror.New("iv length invalid") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "iv length invalid") } text := make([]byte, len(cipherText)) @@ -179,7 +179,7 @@ func DecryptCBC(cipherText []byte, key []byte, iv []byte, padding int) ([]byte, // EncryptCBCTriple encrypts using TripleDES and CBC mode. func EncryptCBCTriple(plainText []byte, key []byte, iv []byte, padding int) ([]byte, error) { if len(key) != 16 && len(key) != 24 { - return nil, gerror.New("key length invalid") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "key length invalid") } var newKey []byte @@ -196,7 +196,7 @@ func EncryptCBCTriple(plainText []byte, key []byte, iv []byte, padding int) ([]b } if len(iv) != block.BlockSize() { - return nil, gerror.New("iv length invalid") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "iv length invalid") } text, err := Padding(plainText, padding) @@ -214,7 +214,7 @@ func EncryptCBCTriple(plainText []byte, key []byte, iv []byte, padding int) ([]b // DecryptCBCTriple decrypts <cipherText> using TripleDES and CBC mode. func DecryptCBCTriple(cipherText []byte, key []byte, iv []byte, padding int) ([]byte, error) { if len(key) != 16 && len(key) != 24 { - return nil, gerror.New("key length invalid") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "key length invalid") } var newKey []byte @@ -231,7 +231,7 @@ func DecryptCBCTriple(cipherText []byte, key []byte, iv []byte, padding int) ([] } if len(iv) != block.BlockSize() { - return nil, gerror.New("iv length invalid") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "iv length invalid") } text := make([]byte, len(cipherText)) @@ -262,12 +262,12 @@ func Padding(text []byte, padding int) ([]byte, error) { switch padding { case NOPADDING: if len(text)%8 != 0 { - return nil, gerror.New("text length invalid") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "text length invalid") } case PKCS5PADDING: return PaddingPKCS5(text, 8), nil default: - return nil, gerror.New("padding type error") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "padding type error") } return text, nil @@ -277,12 +277,12 @@ func UnPadding(text []byte, padding int) ([]byte, error) { switch padding { case NOPADDING: if len(text)%8 != 0 { - return nil, gerror.New("text length invalid") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "text length invalid") } case PKCS5PADDING: return UnPaddingPKCS5(text), nil default: - return nil, gerror.New("padding type error") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "padding type error") } return text, nil } diff --git a/database/gdb/gdb.go b/database/gdb/gdb.go index f197e5675..dd5232d08 100644 --- a/database/gdb/gdb.go +++ b/database/gdb/gdb.go @@ -10,7 +10,6 @@ package gdb import ( "context" "database/sql" - "fmt" "time" "github.com/gogf/gf/errors/gerror" @@ -333,7 +332,10 @@ func New(group ...string) (db DB, err error) { defer configs.RUnlock() if len(configs.config) < 1 { - return nil, gerror.New("database configuration is empty, please set the database configuration before using") + return nil, gerror.NewCode( + gerror.CodeInvalidConfiguration, + "database configuration is empty, please set the database configuration before using", + ) } if _, ok := configs.config[groupName]; ok { if node, err := getConfigNodeByGroup(groupName, true); err == nil { @@ -352,7 +354,8 @@ func New(group ...string) (db DB, err error) { } return c.db, nil } else { - return nil, gerror.Newf( + return nil, gerror.NewCodef( + gerror.CodeInvalidConfiguration, `cannot find database driver for specified database type "%s", did you misspell type name "%s" or forget importing the database driver?`, node.Type, node.Type, ) @@ -361,7 +364,8 @@ func New(group ...string) (db DB, err error) { return nil, err } } else { - return nil, gerror.Newf( + return nil, gerror.NewCodef( + gerror.CodeInvalidConfiguration, `database configuration node "%s" is not found, did you misspell group name "%s" or miss the database configuration?`, groupName, groupName, ) @@ -404,7 +408,7 @@ func getConfigNodeByGroup(group string, master bool) (*ConfigNode, error) { } } if len(masterList) < 1 { - return nil, gerror.New("at least one master node configuration's need to make sense") + return nil, gerror.NewCode(gerror.CodeInvalidConfiguration, "at least one master node configuration's need to make sense") } if len(slaveList) < 1 { slaveList = masterList @@ -415,7 +419,7 @@ func getConfigNodeByGroup(group string, master bool) (*ConfigNode, error) { return getConfigNodeByWeight(slaveList), nil } } else { - return nil, gerror.New(fmt.Sprintf("empty database configuration for item name '%s'", group)) + return nil, gerror.NewCodef(gerror.CodeInvalidConfiguration, "empty database configuration for item name '%s'", group) } } diff --git a/database/gdb/gdb_core.go b/database/gdb/gdb_core.go index 2b96dd8ec..3b0cbe7f5 100644 --- a/database/gdb/gdb_core.go +++ b/database/gdb/gdb_core.go @@ -89,7 +89,7 @@ func (c *Core) GetCtxTimeout(timeoutType int, ctx context.Context) (context.Cont return context.WithTimeout(ctx, c.db.GetConfig().PrepareTimeout) } default: - panic(gerror.Newf("invalid context timeout type: %d", timeoutType)) + panic(gerror.NewCodef(gerror.CodeInvalidParameter, "invalid context timeout type: %d", timeoutType)) } return ctx, func() {} } @@ -553,7 +553,7 @@ func (c *Core) DoUpdate(ctx context.Context, link Link, table string, data inter updates = gconv.String(data) } if len(updates) == 0 { - return nil, gerror.New("data cannot be empty") + return nil, gerror.NewCode(gerror.CodeMissingParameter, "data cannot be empty") } if len(params) > 0 { args = append(params, args...) diff --git a/database/gdb/gdb_core_underlying.go b/database/gdb/gdb_core_underlying.go index ba09b503f..80dd32d58 100644 --- a/database/gdb/gdb_core_underlying.go +++ b/database/gdb/gdb_core_underlying.go @@ -136,7 +136,7 @@ func (c *Core) DoExec(ctx context.Context, link Link, sql string, args ...interf func (c *Core) DoCommit(ctx context.Context, link Link, sql string, args []interface{}) (newSql string, newArgs []interface{}, err error) { if c.db.GetConfig().CtxStrict { if v := ctx.Value(ctxStrictKeyName); v == nil { - return sql, args, gerror.New(ctxStrictErrorStr) + return sql, args, gerror.NewCode(gerror.CodeMissingParameter, ctxStrictErrorStr) } } return sql, args, nil @@ -181,7 +181,7 @@ func (c *Core) DoPrepare(ctx context.Context, link Link, sql string) (*Stmt, err if c.db.GetConfig().CtxStrict { if v := ctx.Value(ctxStrictKeyName); v == nil { - return nil, gerror.New(ctxStrictErrorStr) + return nil, gerror.NewCode(gerror.CodeMissingParameter, ctxStrictErrorStr) } } diff --git a/database/gdb/gdb_driver_mssql.go b/database/gdb/gdb_driver_mssql.go index f56c2f966..c5ac9be8a 100644 --- a/database/gdb/gdb_driver_mssql.go +++ b/database/gdb/gdb_driver_mssql.go @@ -214,7 +214,7 @@ func (d *DriverMssql) TableFields(ctx context.Context, table string, schema ...s charL, charR := d.GetChars() table = gstr.Trim(table, charL+charR) if gstr.Contains(table, " ") { - return nil, gerror.New("function TableFields supports only single table operations") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "function TableFields supports only single table operations") } useSchema := d.db.GetSchema() if len(schema) > 0 && schema[0] != "" { @@ -292,10 +292,10 @@ ORDER BY a.id,a.colorder`, func (d *DriverMssql) DoInsert(ctx context.Context, link Link, table string, list List, option DoInsertOption) (result sql.Result, err error) { switch option.InsertOption { case insertOptionSave: - return nil, gerror.New(`Save operation is not supported by mssql driver`) + return nil, gerror.NewCode(gerror.CodeNotSupported, `Save operation is not supported by mssql driver`) case insertOptionReplace: - return nil, gerror.New(`Replace operation is not supported by mssql driver`) + return nil, gerror.NewCode(gerror.CodeNotSupported, `Replace operation is not supported by mssql driver`) default: return d.Core.DoInsert(ctx, link, table, list, option) diff --git a/database/gdb/gdb_driver_mysql.go b/database/gdb/gdb_driver_mysql.go index a9ac18296..d4c5e53f0 100644 --- a/database/gdb/gdb_driver_mysql.go +++ b/database/gdb/gdb_driver_mysql.go @@ -121,7 +121,7 @@ func (d *DriverMysql) TableFields(ctx context.Context, table string, schema ...s charL, charR := d.GetChars() table = gstr.Trim(table, charL+charR) if gstr.Contains(table, " ") { - return nil, gerror.New("function TableFields supports only single table operations") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "function TableFields supports only single table operations") } useSchema := d.schema.Val() if len(schema) > 0 && schema[0] != "" { diff --git a/database/gdb/gdb_driver_oracle.go b/database/gdb/gdb_driver_oracle.go index 7ea5fcd54..d42cd1974 100644 --- a/database/gdb/gdb_driver_oracle.go +++ b/database/gdb/gdb_driver_oracle.go @@ -186,7 +186,7 @@ func (d *DriverOracle) TableFields(ctx context.Context, table string, schema ... charL, charR := d.GetChars() table = gstr.Trim(table, charL+charR) if gstr.Contains(table, " ") { - return nil, gerror.New("function TableFields supports only single table operations") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "function TableFields supports only single table operations") } useSchema := d.db.GetSchema() if len(schema) > 0 && schema[0] != "" { @@ -278,10 +278,10 @@ func (d *DriverOracle) getTableUniqueIndex(table string) (fields map[string]map[ func (d *DriverOracle) DoInsert(ctx context.Context, link Link, table string, list List, option DoInsertOption) (result sql.Result, err error) { switch option.InsertOption { case insertOptionSave: - return nil, gerror.New(`Save operation is not supported by mssql driver`) + return nil, gerror.NewCode(gerror.CodeNotSupported, `Save operation is not supported by mssql driver`) case insertOptionReplace: - return nil, gerror.New(`Replace operation is not supported by mssql driver`) + return nil, gerror.NewCode(gerror.CodeNotSupported, `Replace operation is not supported by mssql driver`) } var ( diff --git a/database/gdb/gdb_driver_pgsql.go b/database/gdb/gdb_driver_pgsql.go index 3503313d9..07a8029fc 100644 --- a/database/gdb/gdb_driver_pgsql.go +++ b/database/gdb/gdb_driver_pgsql.go @@ -126,7 +126,7 @@ func (d *DriverPgsql) TableFields(ctx context.Context, table string, schema ...s charL, charR := d.GetChars() table = gstr.Trim(table, charL+charR) if gstr.Contains(table, " ") { - return nil, gerror.New("function TableFields supports only single table operations") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "function TableFields supports only single table operations") } table, _ = gregex.ReplaceString("\"", "", table) useSchema := d.db.GetSchema() @@ -190,10 +190,10 @@ ORDER BY a.attnum`, func (d *DriverPgsql) DoInsert(ctx context.Context, link Link, table string, list List, option DoInsertOption) (result sql.Result, err error) { switch option.InsertOption { case insertOptionSave: - return nil, gerror.New(`Save operation is not supported by pgsql driver`) + return nil, gerror.NewCode(gerror.CodeNotSupported, `Save operation is not supported by pgsql driver`) case insertOptionReplace: - return nil, gerror.New(`Replace operation is not supported by pgsql driver`) + return nil, gerror.NewCode(gerror.CodeNotSupported, `Replace operation is not supported by pgsql driver`) default: return d.Core.DoInsert(ctx, link, table, list, option) diff --git a/database/gdb/gdb_driver_sqlite.go b/database/gdb/gdb_driver_sqlite.go index 132fe5c32..61703aa43 100644 --- a/database/gdb/gdb_driver_sqlite.go +++ b/database/gdb/gdb_driver_sqlite.go @@ -99,7 +99,7 @@ func (d *DriverSqlite) TableFields(ctx context.Context, table string, schema ... charL, charR := d.GetChars() table = gstr.Trim(table, charL+charR) if gstr.Contains(table, " ") { - return nil, gerror.New("function TableFields supports only single table operations") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "function TableFields supports only single table operations") } useSchema := d.db.GetSchema() if len(schema) > 0 && schema[0] != "" { @@ -141,10 +141,10 @@ func (d *DriverSqlite) TableFields(ctx context.Context, table string, schema ... func (d *DriverSqlite) DoInsert(ctx context.Context, link Link, table string, list List, option DoInsertOption) (result sql.Result, err error) { switch option.InsertOption { case insertOptionSave: - return nil, gerror.New(`Save operation is not supported by sqlite driver`) + return nil, gerror.NewCode(gerror.CodeNotSupported, `Save operation is not supported by sqlite driver`) case insertOptionReplace: - return nil, gerror.New(`Replace operation is not supported by sqlite driver`) + return nil, gerror.NewCode(gerror.CodeNotSupported, `Replace operation is not supported by sqlite driver`) default: return d.Core.DoInsert(ctx, link, table, list, option) diff --git a/database/gdb/gdb_func.go b/database/gdb/gdb_func.go index 0f8c9541b..d88c81aa1 100644 --- a/database/gdb/gdb_func.go +++ b/database/gdb/gdb_func.go @@ -805,7 +805,7 @@ func handleArguments(sql string, args []interface{}) (newSql string, newArgs []i // formatError customizes and returns the SQL error. func formatError(err error, sql string, args ...interface{}) error { if err != nil && err != ErrNoRows { - return gerror.New(fmt.Sprintf("%s, %s\n", err.Error(), FormatSqlWithArgs(sql, args))) + return gerror.NewCodef(gerror.CodeDbOperationError, "%s, %s\n", err.Error(), FormatSqlWithArgs(sql, args)) } return err } diff --git a/database/gdb/gdb_model_delete.go b/database/gdb/gdb_model_delete.go index 1e08d68da..43af4544c 100644 --- a/database/gdb/gdb_model_delete.go +++ b/database/gdb/gdb_model_delete.go @@ -44,7 +44,7 @@ func (m *Model) Delete(where ...interface{}) (result sql.Result, err error) { } conditionStr := conditionWhere + conditionExtra if !gstr.ContainsI(conditionStr, " WHERE ") { - return nil, gerror.New("there should be WHERE condition statement for DELETE operation") + return nil, gerror.NewCode(gerror.CodeMissingParameter, "there should be WHERE condition statement for DELETE operation") } return m.db.DoDelete(m.GetCtx(), m.getLink(true), m.tables, conditionStr, conditionArgs...) } diff --git a/database/gdb/gdb_model_insert.go b/database/gdb/gdb_model_insert.go index 02a60d373..6f29229d4 100644 --- a/database/gdb/gdb_model_insert.go +++ b/database/gdb/gdb_model_insert.go @@ -8,7 +8,6 @@ package gdb import ( "database/sql" - "fmt" "github.com/gogf/gf/container/gset" "reflect" @@ -211,7 +210,7 @@ func (m *Model) doInsertWithOption(insertOption int) (result sql.Result, err err } }() if m.data == nil { - return nil, gerror.New("inserting into table with empty data") + return nil, gerror.NewCode(gerror.CodeMissingParameter, "inserting into table with empty data") } var ( list List @@ -276,12 +275,12 @@ func (m *Model) doInsertWithOption(insertOption int) (result sql.Result, err err } default: - return result, gerror.New(fmt.Sprint("unsupported list type:", kind)) + return result, gerror.NewCodef(gerror.CodeInvalidParameter, "unsupported list type:%v", kind) } } if len(list) < 1 { - return result, gerror.New("data list cannot be empty") + return result, gerror.NewCode(gerror.CodeMissingParameter, "data list cannot be empty") } // Automatic handling for creating/updating time. @@ -366,7 +365,11 @@ func (m *Model) formatDoInsertOption(insertOption int, columnNames []string) (op } default: - return option, gerror.Newf(`unsupported OnDuplicate parameter type "%s"`, reflect.TypeOf(m.onDuplicate)) + return option, gerror.NewCodef( + gerror.CodeInvalidParameter, + `unsupported OnDuplicate parameter type "%s"`, + reflect.TypeOf(m.onDuplicate), + ) } } } else if onDuplicateExKeySet.Size() > 0 { @@ -406,7 +409,11 @@ func (m *Model) formatOnDuplicateExKeys(onDuplicateEx interface{}) ([]string, er return gconv.Strings(onDuplicateEx), nil default: - return nil, gerror.Newf(`unsupported OnDuplicateEx parameter type "%s"`, reflect.TypeOf(onDuplicateEx)) + return nil, gerror.NewCodef( + gerror.CodeInvalidParameter, + `unsupported OnDuplicateEx parameter type "%s"`, + reflect.TypeOf(onDuplicateEx), + ) } } diff --git a/database/gdb/gdb_model_select.go b/database/gdb/gdb_model_select.go index 897eae92f..5dc716fad 100644 --- a/database/gdb/gdb_model_select.go +++ b/database/gdb/gdb_model_select.go @@ -316,7 +316,7 @@ func (m *Model) Scan(pointer interface{}, where ...interface{}) error { reflectKind = reflectValue.Kind() if reflectKind != reflect.Ptr { - return gerror.New(`the parameter "pointer" for function Scan should type of pointer`) + return gerror.NewCode(gerror.CodeInvalidParameter, `the parameter "pointer" for function Scan should type of pointer`) } for reflectKind == reflect.Ptr { reflectValue = reflectValue.Elem() @@ -331,7 +331,10 @@ func (m *Model) Scan(pointer interface{}, where ...interface{}) error { return m.doStruct(pointer, where...) default: - return gerror.New(`element of parameter "pointer" for function Scan should type of struct/*struct/[]struct/[]*struct`) + return gerror.NewCode( + gerror.CodeInvalidParameter, + `element of parameter "pointer" for function Scan should type of struct/*struct/[]struct/[]*struct`, + ) } } diff --git a/database/gdb/gdb_model_update.go b/database/gdb/gdb_model_update.go index f72e622ff..80d7ad2a8 100644 --- a/database/gdb/gdb_model_update.go +++ b/database/gdb/gdb_model_update.go @@ -39,7 +39,7 @@ func (m *Model) Update(dataAndWhere ...interface{}) (result sql.Result, err erro } }() if m.data == nil { - return nil, gerror.New("updating table with empty data") + return nil, gerror.NewCode(gerror.CodeMissingParameter, "updating table with empty data") } var ( updateData = m.data @@ -80,7 +80,7 @@ func (m *Model) Update(dataAndWhere ...interface{}) (result sql.Result, err erro } conditionStr := conditionWhere + conditionExtra if !gstr.ContainsI(conditionStr, " WHERE ") { - return nil, gerror.New("there should be WHERE condition statement for UPDATE operation") + return nil, gerror.NewCode(gerror.CodeMissingParameter, "there should be WHERE condition statement for UPDATE operation") } return m.db.DoUpdate( m.GetCtx(), diff --git a/database/gdb/gdb_model_with.go b/database/gdb/gdb_model_with.go index 12ab46f55..e9fff363c 100644 --- a/database/gdb/gdb_model_with.go +++ b/database/gdb/gdb_model_with.go @@ -126,7 +126,8 @@ func (m *Model) doWithScanStruct(pointer interface{}) error { } } if relatedFieldValue == nil { - return gerror.Newf( + return gerror.NewCodef( + gerror.CodeInvalidParameter, `cannot find the related value for attribute name "%s" of with tag "%s"`, relatedAttrName, withTag, ) @@ -238,7 +239,8 @@ func (m *Model) doWithScanStructs(pointer interface{}) error { } } if relatedFieldValue == nil { - return gerror.Newf( + return gerror.NewCodef( + gerror.CodeInvalidParameter, `cannot find the related value for attribute name "%s" of with tag "%s"`, relatedAttrName, withTag, ) diff --git a/database/gdb/gdb_statement.go b/database/gdb/gdb_statement.go index 51d8a4b2f..9bca2980f 100644 --- a/database/gdb/gdb_statement.go +++ b/database/gdb/gdb_statement.go @@ -59,7 +59,7 @@ func (s *Stmt) doStmtCommit(ctx context.Context, stmtType string, args ...interf result = s.Stmt.QueryRowContext(ctx, args...) default: - panic(gerror.Newf(`invalid stmtType: %s`, stmtType)) + panic(gerror.NewCodef(gerror.CodeInvalidParameter, `invalid stmtType: %s`, stmtType)) } var ( timestampMilli2 = gtime.TimestampMilli() diff --git a/database/gdb/gdb_type_result_scanlist.go b/database/gdb/gdb_type_result_scanlist.go index 18887471e..ee738ad11 100644 --- a/database/gdb/gdb_type_result_scanlist.go +++ b/database/gdb/gdb_type_result_scanlist.go @@ -55,7 +55,7 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr } // Necessary checks for parameters. if bindToAttrName == "" { - return gerror.New(`bindToAttrName should not be empty`) + return gerror.NewCode(gerror.CodeInvalidParameter, `bindToAttrName should not be empty`) } var ( @@ -67,12 +67,12 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr reflectKind = reflectValue.Kind() } if reflectKind != reflect.Ptr { - return gerror.Newf("listPointer should be type of *[]struct/*[]*struct, but got: %v", reflectKind) + return gerror.NewCodef(gerror.CodeInvalidParameter, "listPointer should be type of *[]struct/*[]*struct, but got: %v", reflectKind) } reflectValue = reflectValue.Elem() reflectKind = reflectValue.Kind() if reflectKind != reflect.Slice && reflectKind != reflect.Array { - return gerror.Newf("listPointer should be type of *[]struct/*[]*struct, but got: %v", reflectKind) + return gerror.NewCodef(gerror.CodeInvalidParameter, "listPointer should be type of *[]struct/*[]*struct, but got: %v", reflectKind) } length := len(result) if length == 0 { @@ -135,7 +135,8 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr relationResultFieldName = array[0] relationBindToSubAttrName = array[1] if key, _ := gutil.MapPossibleItemByKey(result[0].Map(), relationResultFieldName); key == "" { - return gerror.Newf( + return gerror.NewCodef( + gerror.CodeInvalidParameter, `cannot find possible related table field name "%s" from given relation key "%s"`, relationResultFieldName, relationKVStr, @@ -144,14 +145,14 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr relationResultFieldName = key } } else { - return gerror.New(`parameter relationKV should be format of "ResultFieldName:BindToAttrName"`) + return gerror.NewCode(gerror.CodeInvalidParameter, `parameter relationKV should be format of "ResultFieldName:BindToAttrName"`) } if relationResultFieldName != "" { // Note that the value might be type of slice. relationDataMap = result.MapKeyValue(relationResultFieldName) } if len(relationDataMap) == 0 { - return gerror.Newf(`cannot find the relation data map, maybe invalid relation given "%v"`, relationKV) + return gerror.NewCodef(gerror.CodeInvalidParameter, `cannot find the relation data map, maybe invalid relation given "%v"`, relationKV) } } // Bind to target attribute. @@ -164,11 +165,19 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr ) if arrayItemType.Kind() == reflect.Ptr { if bindToAttrField, ok = arrayItemType.Elem().FieldByName(bindToAttrName); !ok { - return gerror.Newf(`invalid parameter bindToAttrName: cannot find attribute with name "%s" from slice element`, bindToAttrName) + return gerror.NewCodef( + gerror.CodeInvalidParameter, + `invalid parameter bindToAttrName: cannot find attribute with name "%s" from slice element`, + bindToAttrName, + ) } } else { if bindToAttrField, ok = arrayItemType.FieldByName(bindToAttrName); !ok { - return gerror.Newf(`invalid parameter bindToAttrName: cannot find attribute with name "%s" from slice element`, bindToAttrName) + return gerror.NewCodef( + gerror.CodeInvalidParameter, + `invalid parameter bindToAttrName: cannot find attribute with name "%s" from slice element`, + bindToAttrName, + ) } } bindToAttrType = bindToAttrField.Type @@ -210,7 +219,7 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr relationFromAttrValue = arrayElemValue } if len(relationDataMap) > 0 && !relationFromAttrValue.IsValid() { - return gerror.Newf(`invalid relation specified: "%v"`, relationKV) + return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid relation specified: "%v"`, relationKV) } // Check and find possible bind to attribute name. if relationKVStr != "" && !relationBindToSubAttrNameChecked { @@ -224,7 +233,8 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr filedMap[relationFromAttrType.Field(i).Name] = struct{}{} } if key, _ := gutil.MapPossibleItemByKey(filedMap, relationBindToSubAttrName); key == "" { - return gerror.Newf( + return gerror.NewCodef( + gerror.CodeInvalidParameter, `cannot find possible related attribute name "%s" from given relation key "%s"`, relationBindToSubAttrName, relationKVStr, @@ -255,10 +265,14 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr } } else { // May be the attribute does not exist yet. - return gerror.Newf(`invalid relation specified: "%v"`, relationKV) + return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid relation specified: "%v"`, relationKV) } } else { - return gerror.Newf(`relationKey should not be empty as field "%s" is slice`, bindToAttrName) + return gerror.NewCodef( + gerror.CodeInvalidParameter, + `relationKey should not be empty as field "%s" is slice`, + bindToAttrName, + ) } case reflect.Ptr: @@ -287,7 +301,7 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr } } else { // May be the attribute does not exist yet. - return gerror.Newf(`invalid relation specified: "%v"`, relationKV) + return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid relation specified: "%v"`, relationKV) } } else { if i >= len(result) { @@ -331,7 +345,7 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr } } else { // May be the attribute does not exist yet. - return gerror.Newf(`invalid relation specified: "%v"`, relationKV) + return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid relation specified: "%v"`, relationKV) } } else { if i >= len(result) { @@ -355,7 +369,7 @@ func doScanList(model *Model, result Result, listPointer interface{}, bindToAttr } default: - return gerror.Newf(`unsupported attribute type: %s`, bindToAttrKind.String()) + return gerror.NewCodef(gerror.CodeInvalidParameter, `unsupported attribute type: %s`, bindToAttrKind.String()) } } reflect.ValueOf(listPointer).Elem().Set(arrayValue) diff --git a/database/gdb/gdb_z_mysql_struct_test.go b/database/gdb/gdb_z_mysql_struct_test.go index d4d7a7373..9f56f4772 100644 --- a/database/gdb/gdb_z_mysql_struct_test.go +++ b/database/gdb/gdb_z_mysql_struct_test.go @@ -408,7 +408,7 @@ func (user *User) UnmarshalValue(value interface{}) error { } return nil } - return gerror.Newf(`unsupported value type for UnmarshalValue: %v`, reflect.TypeOf(value)) + return gerror.NewCodef(gerror.CodeInvalidParameter, `unsupported value type for UnmarshalValue: %v`, reflect.TypeOf(value)) } func Test_Model_Scan_UnmarshalValue(t *testing.T) { diff --git a/database/gredis/gredis_config.go b/database/gredis/gredis_config.go index 121b9c4a1..e39a96ddb 100644 --- a/database/gredis/gredis_config.go +++ b/database/gredis/gredis_config.go @@ -114,7 +114,7 @@ func ConfigFromStr(str string) (config *Config, err error) { config.Port = DefaultRedisPort } } else { - err = gerror.Newf(`invalid redis configuration: "%s"`, str) + err = gerror.NewCodef(gerror.CodeInvalidConfiguration, `invalid redis configuration: "%s"`, str) } return } diff --git a/database/gredis/gredis_conn.go b/database/gredis/gredis_conn.go index 2826affcd..ed5f90851 100644 --- a/database/gredis/gredis_conn.go +++ b/database/gredis/gredis_conn.go @@ -50,7 +50,7 @@ func (c *Conn) do(timeout time.Duration, commandName string, args ...interface{} if timeout > 0 { conn, ok := c.Conn.(redis.ConnWithTimeout) if !ok { - return gvar.New(nil), gerror.New(`current connection does not support "ConnWithTimeout"`) + return gvar.New(nil), gerror.NewCode(gerror.CodeNotSupported, `current connection does not support "ConnWithTimeout"`) } return conn.DoWithTimeout(timeout, commandName, args...) } @@ -107,7 +107,7 @@ func (c *Conn) ReceiveVar() (*gvar.Var, error) { func (c *Conn) ReceiveVarWithTimeout(timeout time.Duration) (*gvar.Var, error) { conn, ok := c.Conn.(redis.ConnWithTimeout) if !ok { - return gvar.New(nil), gerror.New(`current connection does not support "ConnWithTimeout"`) + return gvar.New(nil), gerror.NewCode(gerror.CodeNotSupported, `current connection does not support "ConnWithTimeout"`) } return resultToVar(conn.ReceiveWithTimeout(timeout)) } diff --git a/encoding/gcharset/gcharset.go b/encoding/gcharset/gcharset.go index 0aac86b27..af4998fc4 100644 --- a/encoding/gcharset/gcharset.go +++ b/encoding/gcharset/gcharset.go @@ -59,11 +59,11 @@ func Convert(dstCharset string, srcCharset string, src string) (dst string, err transform.NewReader(bytes.NewReader([]byte(src)), e.NewDecoder()), ) if err != nil { - return "", gerror.Newf("%s to utf8 failed. %v", srcCharset, err) + return "", gerror.WrapCodef(gerror.CodeInternalError, err, "%s to utf8 failed", srcCharset) } src = string(tmp) } else { - return dst, gerror.Newf("unsupport srcCharset: %s", srcCharset) + return dst, gerror.NewCodef(gerror.CodeInvalidParameter, "unsupported srcCharset: %s", srcCharset) } } // Do the converting from UTF-8 to <dstCharset>. @@ -73,11 +73,11 @@ func Convert(dstCharset string, srcCharset string, src string) (dst string, err transform.NewReader(bytes.NewReader([]byte(src)), e.NewEncoder()), ) if err != nil { - return "", gerror.Newf("utf to %s failed. %v", dstCharset, err) + return "", gerror.WrapCodef(gerror.CodeInternalError, err, "utf to %s failed", dstCharset) } dst = string(tmp) } else { - return dst, gerror.Newf("unsupport dstCharset: %s", dstCharset) + return dst, gerror.NewCodef(gerror.CodeInvalidParameter, "unsupported dstCharset: %s", dstCharset) } } else { dst = src diff --git a/encoding/gini/gini.go b/encoding/gini/gini.go index 6394d2393..43ae110da 100644 --- a/encoding/gini/gini.go +++ b/encoding/gini/gini.go @@ -70,7 +70,7 @@ func Decode(data []byte) (res map[string]interface{}, err error) { } if haveSection == false { - return nil, gerror.New("failed to parse INI file, section not found") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "failed to parse INI file, section not found") } return res, nil } diff --git a/encoding/gjson/gjson_api_new_load.go b/encoding/gjson/gjson_api_new_load.go index 780b3a16f..9c6c46130 100644 --- a/encoding/gjson/gjson_api_new_load.go +++ b/encoding/gjson/gjson_api_new_load.go @@ -264,7 +264,7 @@ func doLoadContentWithOptions(dataType string, data []byte, options Options) (*J return nil, err } default: - err = gerror.New("unsupported type for loading") + err = gerror.NewCode(gerror.CodeInvalidParameter, "unsupported type for loading") } if err != nil { return nil, err diff --git a/errors/gerror/gerror.go b/errors/gerror/gerror.go index 8b029b23f..b961be831 100644 --- a/errors/gerror/gerror.go +++ b/errors/gerror/gerror.go @@ -49,7 +49,7 @@ func New(text string) error { return &Error{ stack: callers(), text: text, - code: -1, + code: CodeNil, } } @@ -58,7 +58,7 @@ func Newf(format string, args ...interface{}) error { return &Error{ stack: callers(), text: fmt.Sprintf(format, args...), - code: -1, + code: CodeNil, } } @@ -68,7 +68,7 @@ func NewSkip(skip int, text string) error { return &Error{ stack: callers(skip), text: text, - code: -1, + code: CodeNil, } } @@ -78,7 +78,7 @@ func NewSkipf(skip int, format string, args ...interface{}) error { return &Error{ stack: callers(skip), text: fmt.Sprintf(format, args...), - code: -1, + code: CodeNil, } } diff --git a/errors/gerror/gerror_code.go b/errors/gerror/gerror_code.go new file mode 100644 index 000000000..6497b3003 --- /dev/null +++ b/errors/gerror/gerror_code.go @@ -0,0 +1,25 @@ +// Copyright GoFrame Author(https://goframe.org). 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 gerror + +// Reserved internal error code of framework: code < 1000. + +const ( + CodeNil = -1 // No error code specified. + CodeOk = 0 // It is OK without error. + CodeInternalError = 50 // An error occurred internally. + CodeValidationFailed = 51 // Data validation failed. + CodeDbOperationError = 52 // Database operation error. + CodeInvalidParameter = 53 // The given parameter for current operation is invalid. + CodeMissingParameter = 54 // Parameter for current operation is missing. + CodeInvalidOperation = 55 // The function cannot be used like this. + CodeInvalidConfiguration = 56 // The configuration is invalid for current operation. + CodeMissingConfiguration = 57 // The configuration is missing for current operation. + CodeNotImplemented = 58 // The operation is not implemented yet. + CodeNotSupported = 59 // The operation is not supported yet. + CodeOperationFailed = 60 // I tried, but I cannot give you what you want. +) diff --git a/errors/gerror/gerror_error.go b/errors/gerror/gerror_error.go index 01d593134..045385d84 100644 --- a/errors/gerror/gerror_error.go +++ b/errors/gerror/gerror_error.go @@ -179,6 +179,9 @@ func (err *Error) MarshalJSON() ([]byte, error) { // formatSubStack formats the stack for error. func formatSubStack(st stack, buffer *bytes.Buffer) { + if st == nil { + return + } index := 1 space := " " for _, p := range st { diff --git a/errors/gerror/gerror_option.go b/errors/gerror/gerror_option.go new file mode 100644 index 000000000..26ecc18ad --- /dev/null +++ b/errors/gerror/gerror_option.go @@ -0,0 +1,28 @@ +// Copyright GoFrame Author(https://goframe.org). 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 gerror + +// Option is option for creating error. +type Option struct { + Error error // Wrapped error. + Stack bool // Record stack information into error. + Text string // Error text, which is created by New* functions. + Code int // Error code if necessary. +} + +// NewOption creates and returns an error with Option. +func NewOption(option Option) error { + err := &Error{ + error: option.Error, + text: option.Text, + code: option.Code, + } + if option.Stack { + err.stack = callers() + } + return err +} diff --git a/frame/gins/gins_database.go b/frame/gins/gins_database.go index 1206ee7d4..ec854722e 100644 --- a/frame/gins/gins_database.go +++ b/frame/gins/gins_database.go @@ -53,21 +53,24 @@ func Database(name ...string) gdb.DB { if configFilePath == "" { exampleFileName := "config.example.toml" if exampleConfigFilePath, _ := Config().GetFilePath(exampleFileName); exampleConfigFilePath != "" { - panic(gerror.Wrapf( + panic(gerror.WrapCodef( + gerror.CodeMissingConfiguration, err, `configuration file "%s" not found, but found "%s", did you miss renaming the example configuration file?`, Config().GetFileName(), exampleFileName, )) } else { - panic(gerror.Wrapf( + panic(gerror.WrapCodef( + gerror.CodeMissingConfiguration, err, `configuration file "%s" not found, did you miss the configuration file or the misspell the configuration file name?`, Config().GetFileName(), )) } } - panic(gerror.Wrapf( + panic(gerror.WrapCodef( + gerror.CodeMissingConfiguration, err, `database initialization failed: "%s" node not found, is configuration file or configuration node missing?`, configNodeNameDatabase, diff --git a/i18n/gi18n/gi18n_manager.go b/i18n/gi18n/gi18n_manager.go index cc223e32d..90ca866d7 100644 --- a/i18n/gi18n/gi18n_manager.go +++ b/i18n/gi18n/gi18n_manager.go @@ -101,7 +101,7 @@ func (m *Manager) SetPath(path string) error { } else { realPath, _ := gfile.Search(path) if realPath == "" { - return gerror.Newf(`%s does not exist`, path) + return gerror.NewCodef(gerror.CodeInvalidParameter, `%s does not exist`, path) } m.options.Path = realPath } diff --git a/internal/structs/structs_type.go b/internal/structs/structs_type.go index 19e20ad40..ed30ecab2 100644 --- a/internal/structs/structs_type.go +++ b/internal/structs/structs_type.go @@ -7,7 +7,8 @@ package structs import ( - "github.com/gogf/gf/errors/gerror" + "errors" + "fmt" "reflect" ) @@ -49,9 +50,11 @@ exitLoop: reflectKind = reflectValue.Kind() } if reflectKind != reflect.Struct { - return nil, gerror.Newf( - `invalid object kind "%s", kind of "struct" is required`, - reflectKind, + return nil, errors.New( + fmt.Sprintf( + `invalid object kind "%s", kind of "struct" is required`, + reflectKind, + ), ) } reflectType = reflectValue.Type() diff --git a/net/ghttp/ghttp_func.go b/net/ghttp/ghttp_func.go index 7047f0317..9b5e09be2 100644 --- a/net/ghttp/ghttp_func.go +++ b/net/ghttp/ghttp_func.go @@ -26,6 +26,7 @@ func niceCallFunc(f func()) { switch exception { case exceptionExit, exceptionExitAll: return + default: if _, ok := exception.(errorStack); ok { // It's already an error that has stack info. @@ -35,9 +36,13 @@ func niceCallFunc(f func()) { // Note that there's a skip pointing the start stacktrace // of the real error point. if err, ok := exception.(error); ok { - panic(gerror.Wrap(err, "")) + if gerror.Code(err) != gerror.CodeNil { + panic(gerror.Wrap(err, "")) + } else { + panic(gerror.WrapCode(gerror.CodeInternalError, err, "")) + } } else { - panic(gerror.NewSkipf(1, "%v", exception)) + panic(gerror.NewCodeSkipf(gerror.CodeInternalError, 1, "%v", exception)) } } } diff --git a/net/ghttp/ghttp_middleware_handler_response.go b/net/ghttp/ghttp_middleware_handler_response.go index 1a771e877..f8c71c318 100644 --- a/net/ghttp/ghttp_middleware_handler_response.go +++ b/net/ghttp/ghttp_middleware_handler_response.go @@ -27,8 +27,12 @@ func MiddlewareHandlerResponse(r *Request) { ) res, err = r.GetHandlerResponse() if err != nil { + code := gerror.Code(err) + if code == gerror.CodeNil { + code = gerror.CodeInternalError + } internalErr = r.Response.WriteJson(DefaultHandlerResponse{ - Code: gerror.Code(err), + Code: code, Message: err.Error(), Data: nil, }) @@ -38,7 +42,7 @@ func MiddlewareHandlerResponse(r *Request) { return } internalErr = r.Response.WriteJson(DefaultHandlerResponse{ - Code: 0, + Code: gerror.CodeOk, Message: "", Data: res, }) diff --git a/net/ghttp/ghttp_request_middleware.go b/net/ghttp/ghttp_request_middleware.go index fbaf7a7ba..fe76ca064 100644 --- a/net/ghttp/ghttp_request_middleware.go +++ b/net/ghttp/ghttp_request_middleware.go @@ -127,7 +127,7 @@ func (m *middleware) Next() { // Create a new error with stack info. // Note that there's a skip pointing the start stacktrace // of the real error point. - m.request.error = gerror.WrapSkip(1, exception, "") + m.request.error = gerror.WrapCodeSkip(gerror.CodeInternalError, 1, exception, "") } m.request.Response.WriteStatus(http.StatusInternalServerError, exception) loop = false diff --git a/net/ghttp/ghttp_request_param_file.go b/net/ghttp/ghttp_request_param_file.go index 997b82ed4..aea6961cf 100644 --- a/net/ghttp/ghttp_request_param_file.go +++ b/net/ghttp/ghttp_request_param_file.go @@ -35,14 +35,17 @@ type UploadFiles []*UploadFile // Note that it will OVERWRITE the target file if there's already a same name file exist. func (f *UploadFile) Save(dirPath string, randomlyRename ...bool) (filename string, err error) { if f == nil { - return "", gerror.New("file is empty, maybe you retrieve it from invalid field name or form enctype") + return "", gerror.NewCode( + gerror.CodeMissingParameter, + "file is empty, maybe you retrieve it from invalid field name or form enctype", + ) } if !gfile.Exists(dirPath) { if err = gfile.Mkdir(dirPath); err != nil { return } } else if !gfile.IsDir(dirPath) { - return "", gerror.New(`parameter "dirPath" should be a directory path`) + return "", gerror.NewCode(gerror.CodeInvalidParameter, `parameter "dirPath" should be a directory path`) } file, err := f.Open() @@ -76,7 +79,10 @@ func (f *UploadFile) Save(dirPath string, randomlyRename ...bool) (filename stri // The parameter <randomlyRename> specifies whether randomly renames all the file names. func (fs UploadFiles) Save(dirPath string, randomlyRename ...bool) (filenames []string, err error) { if len(fs) == 0 { - return nil, gerror.New("file array is empty, maybe you retrieve it from invalid field name or form enctype") + return nil, gerror.NewCode( + gerror.CodeMissingParameter, + "file array is empty, maybe you retrieve it from invalid field name or form enctype", + ) } for _, f := range fs { if filename, err := f.Save(dirPath, randomlyRename...); err != nil { diff --git a/net/ghttp/ghttp_server.go b/net/ghttp/ghttp_server.go index 36d6cc07c..041b182e7 100644 --- a/net/ghttp/ghttp_server.go +++ b/net/ghttp/ghttp_server.go @@ -125,7 +125,7 @@ func (s *Server) Start() error { // Server can only be run once. if s.Status() == ServerStatusRunning { - return gerror.New("server is already running") + return gerror.NewCode(gerror.CodeInvalidOperation, "server is already running") } // Logging path setting check. @@ -141,7 +141,7 @@ func (s *Server) Start() error { path = gfile.Join(s.config.SessionPath, s.name) if !gfile.Exists(path) { if err := gfile.Mkdir(path); err != nil { - return gerror.Wrapf(err, `mkdir failed for "%s"`, path) + return gerror.WrapCodef(gerror.CodeInternalError, err, `mkdir failed for "%s"`, path) } } } @@ -175,7 +175,10 @@ func (s *Server) Start() error { // If there's no route registered and no static service enabled, // it then returns an error of invalid usage of server. if len(s.routesMap) == 0 && !s.config.FileServerEnabled { - return gerror.New(`there's no route set or static feature enabled, did you forget import the router?`) + return gerror.NewCode( + gerror.CodeInvalidOperation, + `there's no route set or static feature enabled, did you forget import the router?`, + ) } // Start the HTTP server. diff --git a/net/ghttp/ghttp_server_admin_process.go b/net/ghttp/ghttp_server_admin_process.go index e6fa2e622..9fe65b8d3 100644 --- a/net/ghttp/ghttp_server_admin_process.go +++ b/net/ghttp/ghttp_server_admin_process.go @@ -52,7 +52,7 @@ var serverProcessStatus = gtype.NewInt() // The optional parameter <newExeFilePath> specifies the new binary file for creating process. func RestartAllServer(newExeFilePath ...string) error { if !gracefulEnabled { - return gerror.New("graceful reload feature is disabled") + return gerror.NewCode(gerror.CodeInvalidOperation, "graceful reload feature is disabled") } serverActionLocker.Lock() defer serverActionLocker.Unlock() @@ -85,9 +85,10 @@ func checkProcessStatus() error { if status > 0 { switch status { case adminActionRestarting: - return gerror.New("server is restarting") + return gerror.NewCode(gerror.CodeInvalidOperation, "server is restarting") + case adminActionShuttingDown: - return gerror.New("server is shutting down") + return gerror.NewCode(gerror.CodeInvalidOperation, "server is shutting down") } } return nil @@ -98,7 +99,11 @@ func checkProcessStatus() error { func checkActionFrequency() error { interval := gtime.TimestampMilli() - serverActionLastTime.Val() if interval < adminActionIntervalLimit { - return gerror.Newf("too frequent action, please retry in %d ms", adminActionIntervalLimit-interval) + return gerror.NewCodef( + gerror.CodeInvalidOperation, + "too frequent action, please retry in %d ms", + adminActionIntervalLimit-interval, + ) } serverActionLastTime.Set(gtime.TimestampMilli()) return nil diff --git a/net/ghttp/ghttp_server_graceful.go b/net/ghttp/ghttp_server_graceful.go index 2e6f82390..6af3a3368 100644 --- a/net/ghttp/ghttp_server_graceful.go +++ b/net/ghttp/ghttp_server_graceful.go @@ -122,7 +122,7 @@ func (s *gracefulServer) ListenAndServeTLS(certFile, keyFile string, tlsConfig . } if err != nil { - return gerror.Newf(`open cert file "%s","%s" failed: %s`, certFile, keyFile, err.Error()) + return gerror.WrapCodef(gerror.CodeInternalError, err, `open cert file "%s","%s" failed`, certFile, keyFile) } ln, err := s.getNetListener() if err != nil { diff --git a/net/ghttp/ghttp_server_handler.go b/net/ghttp/ghttp_server_handler.go index 64bdf0ee1..e461a9222 100644 --- a/net/ghttp/ghttp_server_handler.go +++ b/net/ghttp/ghttp_server_handler.go @@ -67,9 +67,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if exception := recover(); exception != nil { request.Response.WriteStatus(http.StatusInternalServerError) if err, ok := exception.(error); ok { - s.handleErrorLog(gerror.Wrap(err, ""), request) + if code := gerror.Code(err); code != gerror.CodeNil { + s.handleErrorLog(gerror.Wrap(err, ""), request) + } else { + s.handleErrorLog(gerror.WrapCode(gerror.CodeInternalError, err, ""), request) + } } else { - s.handleErrorLog(gerror.Newf("%v", exception), request) + s.handleErrorLog(gerror.NewCodef(gerror.CodeInternalError, "%v", exception), request) } } } diff --git a/net/ghttp/ghttp_server_router.go b/net/ghttp/ghttp_server_router.go index bee668ddd..1dd4b630b 100644 --- a/net/ghttp/ghttp_server_router.go +++ b/net/ghttp/ghttp_server_router.go @@ -53,7 +53,7 @@ func (s *Server) parsePattern(pattern string) (domain, method, path string, err } } if path == "" { - err = gerror.New("invalid pattern: URI should not be empty") + err = gerror.NewCode(gerror.CodeInvalidParameter, "invalid pattern: URI should not be empty") } if path != "/" { path = strings.TrimRight(path, "/") diff --git a/net/ghttp/ghttp_server_service_handler.go b/net/ghttp/ghttp_server_service_handler.go index 2dbadb2ea..1b846e7e1 100644 --- a/net/ghttp/ghttp_server_service_handler.go +++ b/net/ghttp/ghttp_server_service_handler.go @@ -128,12 +128,14 @@ func (s *Server) checkAndCreateFuncInfo(f interface{}, pkgPath, objName, methodN reflectType := reflect.TypeOf(f) if reflectType.NumIn() == 0 || reflectType.NumIn() > 2 || reflectType.NumOut() > 2 { if pkgPath != "" { - err = gerror.Newf( + err = gerror.NewCodef( + gerror.CodeInvalidParameter, `invalid handler: %s.%s.%s defined as "%s", but "func(*ghttp.Request)" or "func(context.Context)/func(context.Context,Request)/func(context.Context,Request) error/func(context.Context,Request)(Response,error)" is required`, pkgPath, objName, methodName, reflect.TypeOf(f).String(), ) } else { - err = gerror.Newf( + err = gerror.NewCodef( + gerror.CodeInvalidParameter, `invalid handler: defined as "%s", but "func(*ghttp.Request)" or "func(context.Context)/func(context.Context,Request)/func(context.Context,Request) error/func(context.Context,Request)(Response,error)" is required`, reflect.TypeOf(f).String(), ) @@ -142,7 +144,8 @@ func (s *Server) checkAndCreateFuncInfo(f interface{}, pkgPath, objName, methodN } if reflectType.In(0).String() != "context.Context" { - err = gerror.Newf( + err = gerror.NewCodef( + gerror.CodeInvalidParameter, `invalid handler: defined as "%s", but the first input parameter should be type of "context.Context"`, reflect.TypeOf(f).String(), ) @@ -150,7 +153,8 @@ func (s *Server) checkAndCreateFuncInfo(f interface{}, pkgPath, objName, methodN } if reflectType.NumOut() > 0 && reflectType.Out(reflectType.NumOut()-1).String() != "error" { - err = gerror.Newf( + err = gerror.NewCodef( + gerror.CodeInvalidParameter, `invalid handler: defined as "%s", but the last output parameter should be type of "error"`, reflect.TypeOf(f).String(), ) diff --git a/net/ghttp/internal/client/client.go b/net/ghttp/internal/client/client.go index b1e8620a8..59513a847 100644 --- a/net/ghttp/internal/client/client.go +++ b/net/ghttp/internal/client/client.go @@ -242,27 +242,27 @@ func (c *Client) SetProxy(proxyURL string) { } } -// SetTlsKeyCrt sets the certificate and key file for TLS configuration of client. +// SetTLSKeyCrt sets the certificate and key file for TLS configuration of client. func (c *Client) SetTLSKeyCrt(crtFile, keyFile string) error { tlsConfig, err := LoadKeyCrt(crtFile, keyFile) if err != nil { - return err + return gerror.WrapCode(gerror.CodeInternalError, err, "LoadKeyCrt failed") } if v, ok := c.Transport.(*http.Transport); ok { tlsConfig.InsecureSkipVerify = true v.TLSClientConfig = tlsConfig return nil } - return gerror.New(`cannot set TLSClientConfig for custom Transport of the client`) + return gerror.NewCode(gerror.CodeInternalError, `cannot set TLSClientConfig for custom Transport of the client`) } -// SetTlsConfig sets the TLS configuration of client. +// SetTLSConfig sets the TLS configuration of client. func (c *Client) SetTLSConfig(tlsConfig *tls.Config) error { if v, ok := c.Transport.(*http.Transport); ok { v.TLSClientConfig = tlsConfig return nil } - return gerror.New(`cannot set TLSClientConfig for custom Transport of the client`) + return gerror.NewCode(gerror.CodeInternalError, `cannot set TLSClientConfig for custom Transport of the client`) } // LoadKeyCrt creates and returns a TLS configuration object with given certificate and key files. diff --git a/net/ghttp/internal/client/client_request.go b/net/ghttp/internal/client/client_request.go index 90b8970b9..781c5a2ff 100644 --- a/net/ghttp/internal/client/client_request.go +++ b/net/ghttp/internal/client/client_request.go @@ -188,7 +188,7 @@ func (c *Client) prepareRequest(method, url string, data ...interface{}) (req *h if len(array[1]) > 6 && strings.Compare(array[1][0:6], "@file:") == 0 { path := array[1][6:] if !gfile.Exists(path) { - return nil, gerror.Newf(`"%s" does not exist`, path) + return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `"%s" does not exist`, path) } if file, err := writer.CreateFormFile(array[0], gfile.Basename(path)); err == nil { if f, err := os.Open(path); err == nil { diff --git a/net/gipv4/gipv4_ip.go b/net/gipv4/gipv4_ip.go index 29c113d23..aab88ccea 100644 --- a/net/gipv4/gipv4_ip.go +++ b/net/gipv4/gipv4_ip.go @@ -38,7 +38,7 @@ func GetIntranetIp() (ip string, err error) { return "", err } if len(ips) == 0 { - return "", gerror.New("no intranet ip found") + return "", gerror.NewCode(gerror.CodeOperationFailed, "no intranet ip found") } return ips[0], nil } diff --git a/net/gtcp/gtcp_server.go b/net/gtcp/gtcp_server.go index d8c4f22fd..6d22539af 100644 --- a/net/gtcp/gtcp_server.go +++ b/net/gtcp/gtcp_server.go @@ -116,7 +116,7 @@ func (s *Server) Close() error { // Run starts running the TCP Server. func (s *Server) Run() (err error) { if s.handler == nil { - err = gerror.New("start running failed: socket handler not defined") + err = gerror.NewCode(gerror.CodeMissingConfiguration, "start running failed: socket handler not defined") glog.Error(err) return } diff --git a/net/gudp/gudp_server.go b/net/gudp/gudp_server.go index 4987787c9..89f4439c2 100644 --- a/net/gudp/gudp_server.go +++ b/net/gudp/gudp_server.go @@ -78,7 +78,7 @@ func (s *Server) Close() error { // Run starts listening UDP connection. func (s *Server) Run() error { if s.handler == nil { - err := gerror.New("start running failed: socket handler not defined") + err := gerror.NewCode(gerror.CodeMissingConfiguration, "start running failed: socket handler not defined") glog.Error(err) return err } diff --git a/os/gcfg/gcfg_config.go b/os/gcfg/gcfg_config.go index 425a09df5..bff1d6e04 100644 --- a/os/gcfg/gcfg_config.go +++ b/os/gcfg/gcfg_config.go @@ -142,7 +142,7 @@ func (c *Config) SetPath(path string) error { } else { buffer.WriteString(fmt.Sprintf(`[gcfg] SetPath failed: path "%s" does not exist`, path)) } - err := gerror.New(buffer.String()) + err := gerror.NewCode(gerror.CodeOperationFailed, buffer.String()) if errorPrint() { glog.Error(err) } @@ -219,14 +219,14 @@ func (c *Config) AddPath(path string) error { } else { buffer.WriteString(fmt.Sprintf(`[gcfg] AddPath failed: path "%s" does not exist`, path)) } - err := gerror.New(buffer.String()) + err := gerror.NewCode(gerror.CodeOperationFailed, buffer.String()) if errorPrint() { glog.Error(err) } return err } if !isDir { - err := gerror.Newf(`[gcfg] AddPath failed: path "%s" should be directory type`, path) + err := gerror.NewCodef(gerror.CodeInvalidParameter, `[gcfg] AddPath failed: path "%s" should be directory type`, path) if errorPrint() { glog.Error(err) } @@ -329,7 +329,7 @@ func (c *Config) GetFilePath(file ...string) (path string, err error) { } else { buffer.WriteString(fmt.Sprintf("[gcfg] cannot find config file \"%s\" with no path configured", name)) } - err = gerror.New(buffer.String()) + err = gerror.NewCode(gerror.CodeOperationFailed, buffer.String()) } return } diff --git a/os/gcfg/gcfg_config_api.go b/os/gcfg/gcfg_config_api.go index 7e1f0625e..4e7a2a9e8 100644 --- a/os/gcfg/gcfg_config_api.go +++ b/os/gcfg/gcfg_config_api.go @@ -295,7 +295,7 @@ func (c *Config) GetStruct(pattern string, pointer interface{}, mapping ...map[s if j := c.getJson(); j != nil { return j.GetStruct(pattern, pointer, mapping...) } - return gerror.New("configuration not found") + return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found") } // GetStructs converts any slice to given struct slice. @@ -303,7 +303,7 @@ func (c *Config) GetStructs(pattern string, pointer interface{}, mapping ...map[ if j := c.getJson(); j != nil { return j.GetStructs(pattern, pointer, mapping...) } - return gerror.New("configuration not found") + return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found") } // GetMapToMap retrieves the value by specified `pattern` and converts it to specified map variable. @@ -312,7 +312,7 @@ func (c *Config) GetMapToMap(pattern string, pointer interface{}, mapping ...map if j := c.getJson(); j != nil { return j.GetMapToMap(pattern, pointer, mapping...) } - return gerror.New("configuration not found") + return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found") } // GetMapToMaps retrieves the value by specified `pattern` and converts it to specified map slice @@ -322,7 +322,7 @@ func (c *Config) GetMapToMaps(pattern string, pointer interface{}, mapping ...ma if j := c.getJson(); j != nil { return j.GetMapToMaps(pattern, pointer, mapping...) } - return gerror.New("configuration not found") + return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found") } // GetMapToMapsDeep retrieves the value by specified `pattern` and converts it to specified map slice @@ -332,7 +332,7 @@ func (c *Config) GetMapToMapsDeep(pattern string, pointer interface{}, mapping . if j := c.getJson(); j != nil { return j.GetMapToMapsDeep(pattern, pointer, mapping...) } - return gerror.New("configuration not found") + return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found") } // Map converts current Json object to map[string]interface{}. It returns nil if fails. @@ -358,7 +358,7 @@ func (c *Config) Struct(pointer interface{}, mapping ...map[string]string) error if j := c.getJson(); j != nil { return j.Struct(pointer, mapping...) } - return gerror.New("configuration not found") + return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found") } // Structs converts current Json object to specified object slice. @@ -367,7 +367,7 @@ func (c *Config) Structs(pointer interface{}, mapping ...map[string]string) erro if j := c.getJson(); j != nil { return j.Structs(pointer, mapping...) } - return gerror.New("configuration not found") + return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found") } // MapToMap converts current Json object to specified map variable. @@ -376,7 +376,7 @@ func (c *Config) MapToMap(pointer interface{}, mapping ...map[string]string) err if j := c.getJson(); j != nil { return j.MapToMap(pointer, mapping...) } - return gerror.New("configuration not found") + return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found") } // MapToMaps converts current Json object to specified map variable slice. @@ -385,7 +385,7 @@ func (c *Config) MapToMaps(pointer interface{}, mapping ...map[string]string) er if j := c.getJson(); j != nil { return j.MapToMaps(pointer, mapping...) } - return gerror.New("configuration not found") + return gerror.NewCode(gerror.CodeMissingConfiguration, "configuration not found") } // Clear removes all parsed configuration files content cache, diff --git a/os/gcmd/gcmd_handler.go b/os/gcmd/gcmd_handler.go index 73d6c73c3..a0a4b4c8c 100644 --- a/os/gcmd/gcmd_handler.go +++ b/os/gcmd/gcmd_handler.go @@ -14,14 +14,14 @@ import ( // BindHandle registers callback function <f> with <cmd>. func BindHandle(cmd string, f func()) error { if _, ok := defaultCommandFuncMap[cmd]; ok { - return gerror.New("duplicated handle for command:" + cmd) + return gerror.NewCode(gerror.CodeInvalidOperation, "duplicated handle for command:"+cmd) } else { defaultCommandFuncMap[cmd] = f } return nil } -// BindHandle registers callback function with map <m>. +// BindHandleMap registers callback function with map <m>. func BindHandleMap(m map[string]func()) error { var err error for k, v := range m { @@ -37,7 +37,7 @@ func RunHandle(cmd string) error { if handle, ok := defaultCommandFuncMap[cmd]; ok { handle() } else { - return gerror.New("no handle found for command:" + cmd) + return gerror.NewCode(gerror.CodeMissingConfiguration, "no handle found for command:"+cmd) } return nil } @@ -49,10 +49,10 @@ func AutoRun() error { if handle, ok := defaultCommandFuncMap[cmd]; ok { handle() } else { - return gerror.New("no handle found for command:" + cmd) + return gerror.NewCode(gerror.CodeMissingConfiguration, "no handle found for command:"+cmd) } } else { - return gerror.New("no command found") + return gerror.NewCode(gerror.CodeMissingParameter, "no command found") } return nil } diff --git a/os/gcmd/gcmd_parser.go b/os/gcmd/gcmd_parser.go index 1ac003ae2..e6b20b804 100644 --- a/os/gcmd/gcmd_parser.go +++ b/os/gcmd/gcmd_parser.go @@ -94,7 +94,7 @@ func ParseWithArgs(args []string, supportedOptions map[string]bool, strict ...bo i++ continue } else if parser.strict { - return nil, gerror.Newf(`invalid option '%s'`, args[i]) + return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid option '%s'`, args[i]) } } } diff --git a/os/gcmd/gcmd_parser_handler.go b/os/gcmd/gcmd_parser_handler.go index 6e61712f4..03e1ed093 100644 --- a/os/gcmd/gcmd_parser_handler.go +++ b/os/gcmd/gcmd_parser_handler.go @@ -14,7 +14,7 @@ import ( // BindHandle registers callback function <f> with <cmd>. func (p *Parser) BindHandle(cmd string, f func()) error { if _, ok := p.commandFuncMap[cmd]; ok { - return gerror.New("duplicated handle for command:" + cmd) + return gerror.NewCode(gerror.CodeInvalidOperation, "duplicated handle for command:"+cmd) } else { p.commandFuncMap[cmd] = f } @@ -37,7 +37,7 @@ func (p *Parser) RunHandle(cmd string) error { if handle, ok := p.commandFuncMap[cmd]; ok { handle() } else { - return gerror.New("no handle found for command:" + cmd) + return gerror.NewCode(gerror.CodeMissingConfiguration, "no handle found for command:"+cmd) } return nil } @@ -49,10 +49,10 @@ func (p *Parser) AutoRun() error { if handle, ok := p.commandFuncMap[cmd]; ok { handle() } else { - return gerror.New("no handle found for command:" + cmd) + return gerror.NewCode(gerror.CodeMissingConfiguration, "no handle found for command:"+cmd) } } else { - return gerror.New("no command found") + return gerror.NewCode(gerror.CodeMissingParameter, "no command found") } return nil } diff --git a/os/gcron/gcron_cron.go b/os/gcron/gcron_cron.go index 0e148b970..83a5ea8b2 100644 --- a/os/gcron/gcron_cron.go +++ b/os/gcron/gcron_cron.go @@ -62,7 +62,7 @@ func (c *Cron) GetLogLevel() int { func (c *Cron) Add(pattern string, job func(), name ...string) (*Entry, error) { if len(name) > 0 { if c.Search(name[0]) != nil { - return nil, gerror.Newf(`cron job "%s" already exists`, name[0]) + return nil, gerror.NewCodef(gerror.CodeInvalidOperation, `cron job "%s" already exists`, name[0]) } } return c.addEntry(pattern, job, false, name...) diff --git a/os/gcron/gcron_schedule.go b/os/gcron/gcron_schedule.go index a960843e3..bd50c4c1e 100644 --- a/os/gcron/gcron_schedule.go +++ b/os/gcron/gcron_schedule.go @@ -90,7 +90,7 @@ func newSchedule(pattern string) (*cronSchedule, error) { }, nil } } else { - return nil, gerror.Newf(`invalid pattern: "%s"`, pattern) + return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern: "%s"`, pattern) } } // Handle the common cron pattern, like: @@ -139,7 +139,7 @@ func newSchedule(pattern string) (*cronSchedule, error) { } return schedule, nil } else { - return nil, gerror.Newf(`invalid pattern: "%s"`, pattern) + return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern: "%s"`, pattern) } } @@ -156,7 +156,7 @@ func parseItem(item string, min int, max int, allowQuestionMark bool) (map[int]s intervalArray := strings.Split(item, "/") if len(intervalArray) == 2 { if i, err := strconv.Atoi(intervalArray[1]); err != nil { - return nil, gerror.Newf(`invalid pattern item: "%s"`, item) + return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern item: "%s"`, item) } else { interval = i } @@ -178,7 +178,7 @@ func parseItem(item string, min int, max int, allowQuestionMark bool) (map[int]s // Eg: */5 if rangeArray[0] != "*" { if i, err := parseItemValue(rangeArray[0], fieldType); err != nil { - return nil, gerror.Newf(`invalid pattern item: "%s"`, item) + return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern item: "%s"`, item) } else { rangeMin = i rangeMax = i @@ -186,7 +186,7 @@ func parseItem(item string, min int, max int, allowQuestionMark bool) (map[int]s } if len(rangeArray) == 2 { if i, err := parseItemValue(rangeArray[1], fieldType); err != nil { - return nil, gerror.Newf(`invalid pattern item: "%s"`, item) + return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern item: "%s"`, item) } else { rangeMax = i } @@ -220,7 +220,7 @@ func parseItemValue(value string, fieldType byte) (int, error) { } } } - return 0, gerror.Newf(`invalid pattern value: "%s"`, value) + return 0, gerror.NewCodef(gerror.CodeInvalidParameter, `invalid pattern value: "%s"`, value) } // meet checks if the given time <t> meets the runnable point for the job. diff --git a/os/gfile/gfile_copy.go b/os/gfile/gfile_copy.go index 32e9f1320..b8f30c68e 100644 --- a/os/gfile/gfile_copy.go +++ b/os/gfile/gfile_copy.go @@ -7,8 +7,8 @@ package gfile import ( - "errors" "fmt" + "github.com/gogf/gf/errors/gerror" "io" "io/ioutil" "os" @@ -21,10 +21,10 @@ import ( // or else it calls CopyDir. func Copy(src string, dst string) error { if src == "" { - return errors.New("source path cannot be empty") + return gerror.NewCode(gerror.CodeInvalidParameter, "source path cannot be empty") } if dst == "" { - return errors.New("destination path cannot be empty") + return gerror.NewCode(gerror.CodeInvalidParameter, "destination path cannot be empty") } if IsFile(src) { return CopyFile(src, dst) @@ -40,10 +40,10 @@ func Copy(src string, dst string) error { // Thanks: https://gist.github.com/r0l1/92462b38df26839a3ca324697c8cba04 func CopyFile(src, dst string) (err error) { if src == "" { - return errors.New("source file cannot be empty") + return gerror.NewCode(gerror.CodeInvalidParameter, "source file cannot be empty") } if dst == "" { - return errors.New("destination file cannot be empty") + return gerror.NewCode(gerror.CodeInvalidParameter, "destination file cannot be empty") } // If src and dst are the same path, it does nothing. if src == dst { @@ -87,10 +87,10 @@ func CopyFile(src, dst string) (err error) { // Note that, the Source directory must exist and symlinks are ignored and skipped. func CopyDir(src string, dst string) (err error) { if src == "" { - return errors.New("source directory cannot be empty") + return gerror.NewCode(gerror.CodeInvalidParameter, "source directory cannot be empty") } if dst == "" { - return errors.New("destination directory cannot be empty") + return gerror.NewCode(gerror.CodeInvalidParameter, "destination directory cannot be empty") } // If src and dst are the same path, it does nothing. if src == dst { diff --git a/os/gfile/gfile_home.go b/os/gfile/gfile_home.go index 5e5d42fca..15819b550 100644 --- a/os/gfile/gfile_home.go +++ b/os/gfile/gfile_home.go @@ -8,7 +8,7 @@ package gfile import ( "bytes" - "errors" + "github.com/gogf/gf/errors/gerror" "os" "os/exec" "os/user" @@ -56,7 +56,7 @@ func homeUnix() (string, error) { result := strings.TrimSpace(stdout.String()) if result == "" { - return "", errors.New("blank output when reading home directory") + return "", gerror.NewCode(gerror.CodeInternalError, "blank output when reading home directory") } return result, nil @@ -73,7 +73,7 @@ func homeWindows() (string, error) { home = os.Getenv("USERPROFILE") } if home == "" { - return "", errors.New("HOMEDRIVE, HOMEPATH, and USERPROFILE are blank") + return "", gerror.NewCode(gerror.CodeOperationFailed, "HOMEDRIVE, HOMEPATH, and USERPROFILE are blank") } return home, nil diff --git a/os/gfile/gfile_scan.go b/os/gfile/gfile_scan.go index 3b488f776..a14672fe9 100644 --- a/os/gfile/gfile_scan.go +++ b/os/gfile/gfile_scan.go @@ -137,7 +137,7 @@ func ScanDirFileFunc(path string, pattern string, recursive bool, handler func(p // string, or else it appends the sub-file path to result slice. func doScanDir(depth int, path string, pattern string, recursive bool, handler func(path string) string) ([]string, error) { if depth >= maxScanDepth { - return nil, gerror.Newf("directory scanning exceeds max recursive depth: %d", maxScanDepth) + return nil, gerror.NewCodef(gerror.CodeOperationFailed, "directory scanning exceeds max recursive depth: %d", maxScanDepth) } list := ([]string)(nil) file, err := os.Open(path) diff --git a/os/gfile/gfile_search.go b/os/gfile/gfile_search.go index 08d3d01fc..7dcc9d77d 100644 --- a/os/gfile/gfile_search.go +++ b/os/gfile/gfile_search.go @@ -8,8 +8,8 @@ package gfile import ( "bytes" - "errors" "fmt" + "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/container/garray" ) @@ -52,7 +52,7 @@ func Search(name string, prioritySearchPaths ...string) (realPath string, err er buffer.WriteString(fmt.Sprintf("\n%d. %s", k+1, v)) } }) - err = errors.New(buffer.String()) + err = gerror.NewCode(gerror.CodeOperationFailed, buffer.String()) } return } diff --git a/os/gfpool/gfpool_file.go b/os/gfpool/gfpool_file.go index 8a734ecde..aab691279 100644 --- a/os/gfpool/gfpool_file.go +++ b/os/gfpool/gfpool_file.go @@ -7,8 +7,8 @@ package gfpool import ( - "errors" "fmt" + "github.com/gogf/gf/errors/gerror" "os" "time" ) @@ -41,7 +41,7 @@ func Open(path string, flag int, perm os.FileMode, ttl ...time.Duration) (file * // Stat returns the FileInfo structure describing file. func (f *File) Stat() (os.FileInfo, error) { if f.stat == nil { - return nil, errors.New("file stat is empty") + return nil, gerror.NewCode(gerror.CodeInternalError, "file stat is empty") } return f.stat, nil } diff --git a/os/gfsnotify/gfsnotify.go b/os/gfsnotify/gfsnotify.go index 9c2f5864f..89fb6b958 100644 --- a/os/gfsnotify/gfsnotify.go +++ b/os/gfsnotify/gfsnotify.go @@ -139,7 +139,7 @@ func RemoveCallback(callbackId int) error { callback = r.(*Callback) } if callback == nil { - return gerror.Newf(`callback for id %d not found`, callbackId) + return gerror.NewCodef(gerror.CodeInvalidParameter, `callback for id %d not found`, callbackId) } w.RemoveCallback(callbackId) return nil diff --git a/os/gfsnotify/gfsnotify_watcher.go b/os/gfsnotify/gfsnotify_watcher.go index 777ada43a..af6c2ff22 100644 --- a/os/gfsnotify/gfsnotify_watcher.go +++ b/os/gfsnotify/gfsnotify_watcher.go @@ -66,7 +66,7 @@ func (w *Watcher) AddOnce(name, path string, callbackFunc func(event *Event), re func (w *Watcher) addWithCallbackFunc(name, path string, callbackFunc func(event *Event), recursive ...bool) (callback *Callback, err error) { // Check and convert the given path to absolute path. if t := fileRealPath(path); t == "" { - return nil, gerror.Newf(`"%s" does not exist`, path) + return nil, gerror.NewCodef(gerror.CodeInvalidParameter, `"%s" does not exist`, path) } else { path = t } diff --git a/os/glog/glog_logger_config.go b/os/glog/glog_logger_config.go index b4d17b6f7..6cc95ef05 100644 --- a/os/glog/glog_logger_config.go +++ b/os/glog/glog_logger_config.go @@ -81,7 +81,7 @@ func (l *Logger) SetConfig(config Config) error { // SetConfigWithMap set configurations with map for the logger. func (l *Logger) SetConfigWithMap(m map[string]interface{}) error { if m == nil || len(m) == 0 { - return gerror.New("configuration cannot be empty") + return gerror.NewCode(gerror.CodeInvalidParameter, "configuration cannot be empty") } // The m now is a shallow copy of m. // A little tricky, isn't it? @@ -92,7 +92,7 @@ func (l *Logger) SetConfigWithMap(m map[string]interface{}) error { if level, ok := levelStringMap[strings.ToUpper(gconv.String(levelValue))]; ok { m[levelKey] = level } else { - return gerror.Newf(`invalid level string: %v`, levelValue) + return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid level string: %v`, levelValue) } } // Change string configuration to int value for file rotation size. @@ -100,7 +100,7 @@ func (l *Logger) SetConfigWithMap(m map[string]interface{}) error { if rotateSizeValue != nil { m[rotateSizeKey] = gfile.StrToSize(gconv.String(rotateSizeValue)) if m[rotateSizeKey] == -1 { - return gerror.Newf(`invalid rotate size: %v`, rotateSizeValue) + return gerror.NewCodef(gerror.CodeInvalidConfiguration, `invalid rotate size: %v`, rotateSizeValue) } } if err := gconv.Struct(m, &l.config); err != nil { @@ -205,12 +205,11 @@ func (l *Logger) GetWriter() io.Writer { // SetPath sets the directory path for file logging. func (l *Logger) SetPath(path string) error { if path == "" { - return gerror.New("logging path is empty") + return gerror.NewCode(gerror.CodeInvalidParameter, "logging path is empty") } if !gfile.Exists(path) { if err := gfile.Mkdir(path); err != nil { - //fmt.Fprintln(os.Stderr, fmt.Sprintf(`[glog] mkdir "%s" failed: %s`, path, err.Error())) - return gerror.Wrapf(err, `Mkdir "%s" failed in PWD "%s"`, path, gfile.Pwd()) + return gerror.WrapCodef(gerror.CodeOperationFailed, err, `Mkdir "%s" failed in PWD "%s"`, path, gfile.Pwd()) } } l.config.Path = strings.TrimRight(path, gfile.Separator) diff --git a/os/glog/glog_logger_level.go b/os/glog/glog_logger_level.go index 67fae2cd7..88c2e374d 100644 --- a/os/glog/glog_logger_level.go +++ b/os/glog/glog_logger_level.go @@ -77,7 +77,7 @@ func (l *Logger) SetLevelStr(levelStr string) error { if level, ok := levelStringMap[strings.ToUpper(levelStr)]; ok { l.config.Level = level } else { - return gerror.Newf(`invalid level string: %s`, levelStr) + return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid level string: %s`, levelStr) } return nil } diff --git a/os/gproc/gproc_comm.go b/os/gproc/gproc_comm.go index fc013eec9..f9014c2a2 100644 --- a/os/gproc/gproc_comm.go +++ b/os/gproc/gproc_comm.go @@ -65,7 +65,7 @@ func getConnByPid(pid int) (*gtcp.PoolConn, error) { return nil, err } } - return nil, gerror.Newf("could not find port for pid: %d", pid) + return nil, gerror.NewCodef(gerror.CodeOperationFailed, "could not find port for pid: %d", pid) } // getPortByPid returns the listening port for specified pid. diff --git a/os/gproc/gproc_comm_send.go b/os/gproc/gproc_comm_send.go index 7946c9a81..762042162 100644 --- a/os/gproc/gproc_comm_send.go +++ b/os/gproc/gproc_comm_send.go @@ -43,8 +43,7 @@ func Send(pid int, data []byte, group ...string) error { }) if len(result) > 0 { response := new(MsgResponse) - err = json.UnmarshalUseNumber(result, response) - if err == nil { + if err = json.UnmarshalUseNumber(result, response); err == nil { if response.Code != 1 { err = gerror.New(response.Message) } diff --git a/os/gproc/gproc_process.go b/os/gproc/gproc_process.go index 51fa28d70..870f89cca 100644 --- a/os/gproc/gproc_process.go +++ b/os/gproc/gproc_process.go @@ -101,7 +101,7 @@ func (p *Process) Send(data []byte) error { if p.Process != nil { return Send(p.Process.Pid, data) } - return gerror.New("invalid process") + return gerror.NewCode(gerror.CodeInvalidParameter, "invalid process") } // Release releases any resources associated with the Process p, diff --git a/os/grpool/grpool.go b/os/grpool/grpool.go index 707eb1304..08d6134cf 100644 --- a/os/grpool/grpool.go +++ b/os/grpool/grpool.go @@ -69,7 +69,7 @@ func Jobs() int { // The job will be executed asynchronously. func (p *Pool) Add(f func()) error { for p.closed.Val() { - return gerror.New("pool closed") + return gerror.NewCode(gerror.CodeInvalidOperation, "pool closed") } p.list.PushFront(f) // Check whether fork new goroutine or not. @@ -96,9 +96,13 @@ func (p *Pool) Add(f func()) error { func (p *Pool) AddWithRecover(userFunc func(), recoverFunc ...func(err error)) error { return p.Add(func() { defer func() { - if err := recover(); err != nil { + if exception := recover(); exception != nil { if len(recoverFunc) > 0 && recoverFunc[0] != nil { - recoverFunc[0](gerror.Newf(`%v`, err)) + if err, ok := exception.(error); ok { + recoverFunc[0](err) + } else { + recoverFunc[0](gerror.NewCodef(gerror.CodeInternalError, `%v`, exception)) + } } } }() diff --git a/os/gsession/gsession.go b/os/gsession/gsession.go index 4d6ac77ad..16b901808 100644 --- a/os/gsession/gsession.go +++ b/os/gsession/gsession.go @@ -8,12 +8,15 @@ package gsession import ( - "errors" + "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/util/guid" ) var ( - ErrorDisabled = errors.New("this feature is disabled in this storage") + ErrorDisabled = gerror.NewOption(gerror.Option{ + Text: "this feature is disabled in this storage", + Code: gerror.CodeNotSupported, + }) ) // NewSessionId creates and returns a new and unique session id string, diff --git a/os/gsession/gsession_session.go b/os/gsession/gsession_session.go index 2067d5b35..78cdb328f 100644 --- a/os/gsession/gsession_session.go +++ b/os/gsession/gsession_session.go @@ -182,7 +182,7 @@ func (s *Session) Id() string { // It returns error if it is called after session starts. func (s *Session) SetId(id string) error { if s.start { - return gerror.New("session already started") + return gerror.NewCode(gerror.CodeInvalidOperation, "session already started") } s.id = id return nil @@ -192,7 +192,7 @@ func (s *Session) SetId(id string) error { // It returns error if it is called after session starts. func (s *Session) SetIdFunc(f func(ttl time.Duration) string) error { if s.start { - return gerror.New("session already started") + return gerror.NewCode(gerror.CodeInvalidOperation, "session already started") } s.idFunc = f return nil diff --git a/os/gsession/gsession_storage_file.go b/os/gsession/gsession_storage_file.go index 7bbbaf2ef..98628c301 100644 --- a/os/gsession/gsession_storage_file.go +++ b/os/gsession/gsession_storage_file.go @@ -48,15 +48,15 @@ func NewStorageFile(path ...string) *StorageFile { if len(path) > 0 && path[0] != "" { storagePath, _ = gfile.Search(path[0]) if storagePath == "" { - panic(gerror.Newf("'%s' does not exist", path[0])) + panic(gerror.NewCodef(gerror.CodeInvalidParameter, `"%s" does not exist`, path[0])) } if !gfile.IsWritable(storagePath) { - panic(gerror.Newf("'%s' is not writable", path[0])) + panic(gerror.NewCodef(gerror.CodeInvalidParameter, `"%s" is not writable`, path[0])) } } if storagePath != "" { if err := gfile.Mkdir(storagePath); err != nil { - panic(gerror.Wrapf(err, `Mkdir "%s" failed in PWD "%s"`, path, gfile.Pwd())) + panic(gerror.WrapCodef(gerror.CodeInternalError, err, `Mkdir "%s" failed in PWD "%s"`, path, gfile.Pwd())) } } s := &StorageFile{ diff --git a/os/gspath/gspath.go b/os/gspath/gspath.go index e54300629..2e7394086 100644 --- a/os/gspath/gspath.go +++ b/os/gspath/gspath.go @@ -103,7 +103,7 @@ func (sp *SPath) Set(path string) (realPath string, err error) { } } if realPath == "" { - return realPath, gerror.Newf(`path "%s" does not exist`, path) + return realPath, gerror.NewCodef(gerror.CodeInvalidParameter, `path "%s" does not exist`, path) } // The set path must be a directory. if gfile.IsDir(realPath) { @@ -123,7 +123,7 @@ func (sp *SPath) Set(path string) (realPath string, err error) { sp.addMonitorByPath(realPath) return realPath, nil } else { - return "", gerror.New(path + " should be a folder") + return "", gerror.NewCode(gerror.CodeInvalidParameter, path+" should be a folder") } } @@ -138,7 +138,7 @@ func (sp *SPath) Add(path string) (realPath string, err error) { } } if realPath == "" { - return realPath, gerror.Newf(`path "%s" does not exist`, path) + return realPath, gerror.NewCodef(gerror.CodeInvalidParameter, `path "%s" does not exist`, path) } // The added path must be a directory. if gfile.IsDir(realPath) { @@ -152,7 +152,7 @@ func (sp *SPath) Add(path string) (realPath string, err error) { } return realPath, nil } else { - return "", gerror.New(path + " should be a folder") + return "", gerror.NewCode(gerror.CodeInvalidParameter, path+" should be a folder") } } diff --git a/os/gtime/gtime.go b/os/gtime/gtime.go index 13b341d36..fe537fb4c 100644 --- a/os/gtime/gtime.go +++ b/os/gtime/gtime.go @@ -276,7 +276,7 @@ func StrToTime(str string, format ...string) (*Time, error) { } return NewFromTime(time.Date(0, time.Month(1), 1, hour, min, sec, nsec, local)), nil } else { - return nil, gerror.New("unsupported time format") + return nil, gerror.NewCode(gerror.CodeInvalidParameter, "unsupported time format") } // Time @@ -311,7 +311,7 @@ func StrToTime(str string, format ...string) (*Time, error) { m, _ := strconv.Atoi(zone[2:4]) s, _ := strconv.Atoi(zone[4:6]) if h > 24 || m > 59 || s > 59 { - return nil, gerror.Newf("invalid zone string: %s", match[6]) + return nil, gerror.NewCodef(gerror.CodeInvalidParameter, "invalid zone string: %s", match[6]) } // Comparing the given time zone whether equals to current time zone, // it converts it to UTC if they does not equal. @@ -350,7 +350,7 @@ func StrToTime(str string, format ...string) (*Time, error) { } } if month <= 0 || day <= 0 { - return nil, gerror.New("invalid time string:" + str) + return nil, gerror.NewCodef(gerror.CodeInvalidParameter, "invalid time string:%s", str) } return NewFromTime(time.Date(year, time.Month(month), day, hour, min, sec, nsec, local)), nil } diff --git a/os/gtime/gtime_time.go b/os/gtime/gtime_time.go index d3a02594a..785e34a84 100644 --- a/os/gtime/gtime_time.go +++ b/os/gtime/gtime_time.go @@ -462,7 +462,7 @@ func (t *Time) UnmarshalText(data []byte) error { *t = *vTime return nil } - return gerror.Newf(`invalid time value: %s`, data) + return gerror.NewCodef(gerror.CodeInvalidParameter, `invalid time value: %s`, data) } // NoValidation marks this struct object will not be validated by package gvalid. diff --git a/os/gview/gview_config.go b/os/gview/gview_config.go index e596b07bf..0bba3cf4b 100644 --- a/os/gview/gview_config.go +++ b/os/gview/gview_config.go @@ -74,7 +74,7 @@ func (view *View) SetConfig(config Config) error { // SetConfigWithMap set configurations with map for the view. func (view *View) SetConfigWithMap(m map[string]interface{}) error { if m == nil || len(m) == 0 { - return gerror.New("configuration cannot be empty") + return gerror.NewCode(gerror.CodeInvalidParameter, "configuration cannot be empty") } // The m now is a shallow copy of m. // Any changes to m does not affect the original one. @@ -123,7 +123,7 @@ func (view *View) SetPath(path string) error { } // Path not exist. if realPath == "" { - err := gerror.Newf(`[gview] SetPath failed: path "%s" does not exist`, path) + err := gerror.NewCodef(gerror.CodeInvalidParameter, `[gview] SetPath failed: path "%s" does not exist`, path) if errorPrint() { glog.Error(err) } @@ -131,7 +131,7 @@ func (view *View) SetPath(path string) error { } // Should be a directory. if !isDir { - err := gerror.Newf(`[gview] SetPath failed: path "%s" should be directory type`, path) + err := gerror.NewCodef(gerror.CodeInvalidParameter, `[gview] SetPath failed: path "%s" should be directory type`, path) if errorPrint() { glog.Error(err) } @@ -177,7 +177,7 @@ func (view *View) AddPath(path string) error { } // Path not exist. if realPath == "" { - err := gerror.Newf(`[gview] AddPath failed: path "%s" does not exist`, path) + err := gerror.NewCodef(gerror.CodeInvalidParameter, `[gview] AddPath failed: path "%s" does not exist`, path) if errorPrint() { glog.Error(err) } @@ -185,7 +185,7 @@ func (view *View) AddPath(path string) error { } // realPath should be type of folder. if !isDir { - err := gerror.Newf(`[gview] AddPath failed: path "%s" should be directory type`, path) + err := gerror.NewCodef(gerror.CodeInvalidParameter, `[gview] AddPath failed: path "%s" should be directory type`, path) if errorPrint() { glog.Error(err) } diff --git a/os/gview/gview_parse.go b/os/gview/gview_parse.go index ef2e242b9..f4da300fa 100644 --- a/os/gview/gview_parse.go +++ b/os/gview/gview_parse.go @@ -112,7 +112,7 @@ func (view *View) Parse(ctx context.Context, file string, params ...Params) (res tpl, err = tpl.(*texttpl.Template).Parse(item.content) } if err != nil && item.path != "" { - err = gerror.Wrap(err, item.path) + err = gerror.WrapCode(gerror.CodeInternalError, err, item.path) } }) if err != nil { @@ -298,7 +298,7 @@ func (view *View) getTemplate(filePath, folderPath, pattern string) (tpl interfa // formatTemplateObjectCreatingError formats the error that creted from creating template object. func (view *View) formatTemplateObjectCreatingError(filePath, tplName string, err error) error { if err != nil { - return gerror.NewSkip(1, gstr.Replace(err.Error(), tplName, filePath)) + return gerror.NewCodeSkip(gerror.CodeInternalError, 1, gstr.Replace(err.Error(), tplName, filePath)) } return nil } @@ -376,7 +376,7 @@ func (view *View) searchFile(file string) (path string, folder string, resource if errorPrint() { glog.Error(buffer.String()) } - err = gerror.Newf(`template file "%s" not found`, file) + err = gerror.NewCodef(gerror.CodeInvalidParameter, `template file "%s" not found`, file) } return } diff --git a/util/gconv/gconv_maptomap.go b/util/gconv/gconv_maptomap.go index ded5ea744..e61aad53e 100644 --- a/util/gconv/gconv_maptomap.go +++ b/util/gconv/gconv_maptomap.go @@ -86,7 +86,7 @@ func doMapToMap(params interface{}, pointer interface{}, mapping ...map[string]s pointerKind = pointerRv.Kind() } if pointerKind != reflect.Map { - return gerror.Newf("pointer should be type of *map, but got:%s", pointerKind) + return gerror.NewCodef(gerror.CodeInvalidParameter, "pointer should be type of *map, but got:%s", pointerKind) } defer func() { // Catch the panic, especially the reflect operation panics. @@ -94,7 +94,7 @@ func doMapToMap(params interface{}, pointer interface{}, mapping ...map[string]s if e, ok := exception.(errorStack); ok { err = e } else { - err = gerror.NewSkipf(1, "%v", exception) + err = gerror.NewCodeSkipf(gerror.CodeInternalError, 1, "%v", exception) } } }() diff --git a/util/gconv/gconv_maptomaps.go b/util/gconv/gconv_maptomaps.go index f4bebc7dc..b37e1ac31 100644 --- a/util/gconv/gconv_maptomaps.go +++ b/util/gconv/gconv_maptomaps.go @@ -73,7 +73,7 @@ func doMapToMaps(params interface{}, pointer interface{}, mapping ...map[string] paramsKind = paramsRv.Kind() } if paramsKind != reflect.Array && paramsKind != reflect.Slice { - return gerror.New("params should be type of slice, eg: []map/[]*map/[]struct/[]*struct") + return gerror.NewCode(gerror.CodeInvalidParameter, "params should be type of slice, eg: []map/[]*map/[]struct/[]*struct") } var ( paramsElem = paramsRv.Type().Elem() @@ -84,7 +84,7 @@ func doMapToMaps(params interface{}, pointer interface{}, mapping ...map[string] paramsElemKind = paramsElem.Kind() } if paramsElemKind != reflect.Map && paramsElemKind != reflect.Struct && paramsElemKind != reflect.Interface { - return gerror.Newf("params element should be type of map/*map/struct/*struct, but got: %s", paramsElemKind) + return gerror.NewCodef(gerror.CodeInvalidParameter, "params element should be type of map/*map/struct/*struct, but got: %s", paramsElemKind) } // Empty slice, no need continue. if paramsRv.Len() == 0 { @@ -100,7 +100,7 @@ func doMapToMaps(params interface{}, pointer interface{}, mapping ...map[string] pointerKind = pointerRv.Kind() } if pointerKind != reflect.Array && pointerKind != reflect.Slice { - return gerror.New("pointer should be type of *[]map/*[]*map") + return gerror.NewCode(gerror.CodeInvalidParameter, "pointer should be type of *[]map/*[]*map") } var ( pointerElemType = pointerRv.Type().Elem() @@ -110,7 +110,7 @@ func doMapToMaps(params interface{}, pointer interface{}, mapping ...map[string] pointerElemKind = pointerElemType.Elem().Kind() } if pointerElemKind != reflect.Map { - return gerror.New("pointer element should be type of map/*map") + return gerror.NewCode(gerror.CodeInvalidParameter, "pointer element should be type of map/*map") } defer func() { // Catch the panic, especially the reflect operation panics. @@ -118,7 +118,7 @@ func doMapToMaps(params interface{}, pointer interface{}, mapping ...map[string] if e, ok := exception.(errorStack); ok { err = e } else { - err = gerror.NewSkipf(1, "%v", exception) + err = gerror.NewCodeSkipf(gerror.CodeInternalError, 1, "%v", exception) } } }() diff --git a/util/gconv/gconv_scan.go b/util/gconv/gconv_scan.go index 1dd76832a..125bb1037 100644 --- a/util/gconv/gconv_scan.go +++ b/util/gconv/gconv_scan.go @@ -23,7 +23,7 @@ func Scan(params interface{}, pointer interface{}, mapping ...map[string]string) pointerKind = pointerType.Kind() ) if pointerKind != reflect.Ptr { - return gerror.Newf("params should be type of pointer, but got: %v", pointerKind) + return gerror.NewCodef(gerror.CodeInvalidParameter, "params should be type of pointer, but got: %v", pointerKind) } var ( pointerElem = pointerType.Elem() @@ -60,7 +60,7 @@ func ScanDeep(params interface{}, pointer interface{}, mapping ...map[string]str t := reflect.TypeOf(pointer) k := t.Kind() if k != reflect.Ptr { - return gerror.Newf("params should be type of pointer, but got: %v", k) + return gerror.NewCodef(gerror.CodeInvalidParameter, "params should be type of pointer, but got: %v", k) } switch t.Elem().Kind() { case reflect.Array, reflect.Slice: diff --git a/util/gconv/gconv_struct.go b/util/gconv/gconv_struct.go index 354905ad2..78649056c 100644 --- a/util/gconv/gconv_struct.go +++ b/util/gconv/gconv_struct.go @@ -7,7 +7,6 @@ package gconv import ( - "fmt" "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/internal/empty" "github.com/gogf/gf/internal/json" @@ -63,7 +62,7 @@ func doStruct(params interface{}, pointer interface{}, mapping map[string]string return nil } if pointer == nil { - return gerror.New("object pointer cannot be nil") + return gerror.NewCode(gerror.CodeInvalidParameter, "object pointer cannot be nil") } defer func() { @@ -72,7 +71,7 @@ func doStruct(params interface{}, pointer interface{}, mapping map[string]string if e, ok := exception.(errorStack); ok { err = e } else { - err = gerror.NewSkipf(1, "%v", exception) + err = gerror.NewCodeSkipf(gerror.CodeInternalError, 1, "%v", exception) } } }() @@ -125,11 +124,11 @@ func doStruct(params interface{}, pointer interface{}, mapping map[string]string pointerReflectValue = reflect.ValueOf(pointer) pointerReflectKind = pointerReflectValue.Kind() if pointerReflectKind != reflect.Ptr { - return gerror.Newf("object pointer should be type of '*struct', but got '%v'", pointerReflectKind) + return gerror.NewCodef(gerror.CodeInvalidParameter, "object pointer should be type of '*struct', but got '%v'", pointerReflectKind) } // Using IsNil on reflect.Ptr variable is OK. if !pointerReflectValue.IsValid() || pointerReflectValue.IsNil() { - return gerror.New("object pointer cannot be nil") + return gerror.NewCode(gerror.CodeInvalidParameter, "object pointer cannot be nil") } pointerElemReflectValue = pointerReflectValue.Elem() } @@ -167,7 +166,7 @@ func doStruct(params interface{}, pointer interface{}, mapping map[string]string // DO NOT use MapDeep here. paramsMap := Map(paramsInterface) if paramsMap == nil { - return gerror.Newf("convert params to map failed: %v", params) + return gerror.NewCodef(gerror.CodeInvalidParameter, "convert params to map failed: %v", params) } // It only performs one converting to the same attribute. @@ -308,7 +307,7 @@ func bindVarToStructAttr(elem reflect.Value, name string, value interface{}, map defer func() { if exception := recover(); exception != nil { if err = bindVarToReflectValue(structFieldValue, value, mapping, priorityTag); err != nil { - err = gerror.Wrapf(err, `error binding value to attribute "%s"`, name) + err = gerror.WrapCodef(gerror.CodeInternalError, err, `error binding value to attribute "%s"`, name) } } }() @@ -461,12 +460,12 @@ func bindVarToReflectValue(structFieldValue reflect.Value, value interface{}, ma default: defer func() { if exception := recover(); exception != nil { - err = gerror.New( - fmt.Sprintf(`cannot convert value "%+v" to type "%s":%+v`, - value, - structFieldValue.Type().String(), - exception, - ), + err = gerror.NewCodef( + gerror.CodeInternalError, + `cannot convert value "%+v" to type "%s":%+v`, + value, + structFieldValue.Type().String(), + exception, ) } }() diff --git a/util/gconv/gconv_structs.go b/util/gconv/gconv_structs.go index d8aafef79..68b4be9ca 100644 --- a/util/gconv/gconv_structs.go +++ b/util/gconv/gconv_structs.go @@ -51,7 +51,7 @@ func doStructs(params interface{}, pointer interface{}, mapping map[string]strin return nil } if pointer == nil { - return gerror.New("object pointer cannot be nil") + return gerror.NewCode(gerror.CodeInvalidParameter, "object pointer cannot be nil") } if doStructsByDirectReflectSet(params, pointer) { @@ -64,7 +64,7 @@ func doStructs(params interface{}, pointer interface{}, mapping map[string]strin if e, ok := exception.(errorStack); ok { err = e } else { - err = gerror.NewSkipf(1, "%v", exception) + err = gerror.NewCodeSkipf(gerror.CodeInternalError, 1, "%v", exception) } } }() @@ -96,7 +96,7 @@ func doStructs(params interface{}, pointer interface{}, mapping map[string]strin if !ok { pointerRv = reflect.ValueOf(pointer) if kind := pointerRv.Kind(); kind != reflect.Ptr { - return gerror.Newf("pointer should be type of pointer, but got: %v", kind) + return gerror.NewCodef(gerror.CodeInvalidParameter, "pointer should be type of pointer, but got: %v", kind) } } // Converting `params` to map slice. diff --git a/util/gvalid/gvalid_error.go b/util/gvalid/gvalid_error.go index 08c3b498e..fd113e989 100644 --- a/util/gvalid/gvalid_error.go +++ b/util/gvalid/gvalid_error.go @@ -7,7 +7,7 @@ package gvalid import ( - "errors" + "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/text/gregex" "github.com/gogf/gf/text/gstr" "strings" @@ -15,6 +15,7 @@ import ( // Error is the validation error for validation result. type Error interface { + Code() int Current() error Error() string FirstItem() (key string, messages map[string]string) @@ -29,6 +30,7 @@ type Error interface { // validationError is the validation error for validation result. type validationError struct { + code int // Error code. rules []string // Rules by sequence, which is used for keeping error sequence. errors map[string]map[string]string // Error map:map[field]map[rule]message firstKey string // The first error rule key(empty in default). @@ -36,7 +38,7 @@ type validationError struct { } // newError creates and returns a validation error. -func newError(rules []string, errors map[string]map[string]string) *validationError { +func newError(code int, rules []string, errors map[string]map[string]string) *validationError { for field, m := range errors { for k, v := range m { v = strings.Replace(v, ":attribute", field, -1) @@ -47,6 +49,7 @@ func newError(rules []string, errors map[string]map[string]string) *validationEr errors[field] = m } return &validationError{ + code: code, rules: rules, errors: errors, } @@ -54,13 +57,21 @@ func newError(rules []string, errors map[string]map[string]string) *validationEr // newErrorStr creates and returns a validation error by string. func newErrorStr(key, err string) *validationError { - return newError(nil, map[string]map[string]string{ + return newError(gerror.CodeInternalError, nil, map[string]map[string]string{ internalErrorMapKey: { key: err, }, }) } +// Code returns the error code of current validation error. +func (e *validationError) Code() int { + if e == nil { + return gerror.CodeNil + } + return e.code +} + // Map returns the first error message as map. func (e *validationError) Map() map[string]string { if e == nil { @@ -179,7 +190,7 @@ func (e *validationError) Current() error { return nil } _, err := e.FirstRule() - return errors.New(err) + return gerror.NewCode(e.code, err) } // String returns all error messages as string, multiple error messages joined using char ';'. diff --git a/util/gvalid/gvalid_validator_check_map.go b/util/gvalid/gvalid_validator_check_map.go index e7e88d67e..d48b413e3 100644 --- a/util/gvalid/gvalid_validator_check_map.go +++ b/util/gvalid/gvalid_validator_check_map.go @@ -7,6 +7,7 @@ package gvalid import ( + "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/util/gconv" "strings" ) @@ -130,7 +131,7 @@ func (v *Validator) doCheckMap(params interface{}) Error { } } if len(errorMaps) > 0 { - return newError(errorRules, errorMaps) + return newError(gerror.CodeValidationFailed, errorRules, errorMaps) } return nil } diff --git a/util/gvalid/gvalid_validator_check_struct.go b/util/gvalid/gvalid_validator_check_struct.go index 58426abfb..868312744 100644 --- a/util/gvalid/gvalid_validator_check_struct.go +++ b/util/gvalid/gvalid_validator_check_struct.go @@ -7,6 +7,7 @@ package gvalid import ( + "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/internal/structs" "github.com/gogf/gf/util/gconv" "github.com/gogf/gf/util/gutil" @@ -249,7 +250,7 @@ func (v *Validator) doCheckStruct(object interface{}) Error { } } if len(errorMaps) > 0 { - return newError(errorRules, errorMaps) + return newError(gerror.CodeValidationFailed, errorRules, errorMaps) } return nil } diff --git a/util/gvalid/gvalid_validator_check_value.go b/util/gvalid/gvalid_validator_check_value.go index a72cee3b3..78377d32d 100644 --- a/util/gvalid/gvalid_validator_check_value.go +++ b/util/gvalid/gvalid_validator_check_value.go @@ -7,7 +7,7 @@ package gvalid import ( - "errors" + "github.com/gogf/gf/errors/gerror" "strconv" "strings" "time" @@ -138,7 +138,7 @@ func (v *Validator) doCheckValue( index++ } if len(errorMsgArray) > 0 { - return newError([]string{rules}, map[string]map[string]string{ + return newError(gerror.CodeValidationFailed, []string{rules}, map[string]map[string]string{ key: errorMsgArray, }) } @@ -175,7 +175,10 @@ func (v *Validator) doCheckBuildInRules( "max-length", "size": if msg := v.checkLength(valueStr, ruleKey, rulePattern, customMsgMap); msg != "" { - return match, errors.New(msg) + return match, gerror.NewOption(gerror.Option{ + Text: msg, + Code: gerror.CodeValidationFailed, + }) } else { match = true } @@ -186,7 +189,10 @@ func (v *Validator) doCheckBuildInRules( "max", "between": if msg := v.checkRange(valueStr, ruleKey, rulePattern, customMsgMap); msg != "" { - return match, errors.New(msg) + return match, gerror.NewOption(gerror.Option{ + Text: msg, + Code: gerror.CodeValidationFailed, + }) } else { match = true } @@ -222,7 +228,10 @@ func (v *Validator) doCheckBuildInRules( var msg string msg = v.getErrorMessageByRule(ruleKey, customMsgMap) msg = strings.Replace(msg, ":format", rulePattern, -1) - return match, errors.New(msg) + return match, gerror.NewOption(gerror.Option{ + Text: msg, + Code: gerror.CodeValidationFailed, + }) } // Values of two fields should be equal as string. @@ -237,7 +246,10 @@ func (v *Validator) doCheckBuildInRules( var msg string msg = v.getErrorMessageByRule(ruleKey, customMsgMap) msg = strings.Replace(msg, ":field", rulePattern, -1) - return match, errors.New(msg) + return match, gerror.NewOption(gerror.Option{ + Text: msg, + Code: gerror.CodeValidationFailed, + }) } // Values of two fields should not be equal as string. @@ -253,7 +265,10 @@ func (v *Validator) doCheckBuildInRules( var msg string msg = v.getErrorMessageByRule(ruleKey, customMsgMap) msg = strings.Replace(msg, ":field", rulePattern, -1) - return match, errors.New(msg) + return match, gerror.NewOption(gerror.Option{ + Text: msg, + Code: gerror.CodeValidationFailed, + }) } // Field value should be in range of. @@ -436,7 +451,10 @@ func (v *Validator) doCheckBuildInRules( match = gregex.IsMatchString(`^([0-9A-Fa-f]{2}[\-:]){5}[0-9A-Fa-f]{2}$`, valueStr) default: - return match, errors.New("Invalid rule name: " + ruleKey) + return match, gerror.NewOption(gerror.Option{ + Text: "Invalid rule name: " + ruleKey, + Code: gerror.CodeInvalidParameter, + }) } return match, nil } diff --git a/util/gvalid/gvalid_z_unit_basic_all_test.go b/util/gvalid/gvalid_z_unit_basic_all_test.go index 30f44e470..b263d1e9e 100755 --- a/util/gvalid/gvalid_z_unit_basic_all_test.go +++ b/util/gvalid/gvalid_z_unit_basic_all_test.go @@ -1014,3 +1014,16 @@ func Test_InternalError_String(t *testing.T) { t.Assert(gerror.Current(err), "InvalidRules: hh") }) } + +func Test_Code(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + err := g.Validator().Rules("required").CheckValue("") + t.AssertNE(err, nil) + t.Assert(gerror.Code(err), gerror.CodeValidationFailed) + }) + gtest.C(t, func(t *gtest.T) { + err := g.Validator().Rules("none-exist-rule").CheckValue("") + t.AssertNE(err, nil) + t.Assert(gerror.Code(err), gerror.CodeInternalError) + }) +}