mirror of
https://github.com/v2fly/v2ray-core.git
synced 2026-01-03 15:55:20 -05:00
rewrite error lib
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"v2ray.com/core/common/errors"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
80
common/errors/errors.go
Normal file
80
common/errors/errors.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package errors
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"v2ray.com/core/common/serial"
|
||||
)
|
||||
|
||||
type HasInnerError interface {
|
||||
Inner() error
|
||||
}
|
||||
|
||||
type Error struct {
|
||||
message string
|
||||
inner error
|
||||
}
|
||||
|
||||
func (v *Error) Error() string {
|
||||
return v.message
|
||||
}
|
||||
|
||||
func (v *Error) Inner() error {
|
||||
if v.inner == nil {
|
||||
return nil
|
||||
}
|
||||
return v.inner
|
||||
}
|
||||
|
||||
func New(msg ...interface{}) error {
|
||||
return &Error{
|
||||
message: serial.ToString(msg),
|
||||
}
|
||||
}
|
||||
|
||||
func Base(err error) ErrorBuilder {
|
||||
return ErrorBuilder{
|
||||
error: err,
|
||||
}
|
||||
}
|
||||
|
||||
func Cause(err error) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
for {
|
||||
inner, ok := err.(HasInnerError)
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
if inner.Inner() == nil {
|
||||
break
|
||||
}
|
||||
err = inner.Inner()
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
type ErrorBuilder struct {
|
||||
error
|
||||
}
|
||||
|
||||
func (v ErrorBuilder) Message(msg ...interface{}) error {
|
||||
if v.error == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &Error{
|
||||
message: serial.ToString(msg) + " > " + v.error.Error(),
|
||||
inner: v.error,
|
||||
}
|
||||
}
|
||||
|
||||
func (v ErrorBuilder) Format(format string, values ...interface{}) error {
|
||||
if v.error == nil {
|
||||
return nil
|
||||
}
|
||||
return &Error{
|
||||
message: fmt.Sprintf(format, values...) + " > " + v.error.Error(),
|
||||
inner: v.error,
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"io"
|
||||
"sync"
|
||||
"v2ray.com/core/common/alloc"
|
||||
"v2ray.com/core/common/errors"
|
||||
)
|
||||
|
||||
type BufferedWriter struct {
|
||||
@@ -34,7 +35,7 @@ func (v *BufferedWriter) ReadFrom(reader io.Reader) (int64, error) {
|
||||
nBytes, err := v.buffer.FillFrom(reader)
|
||||
totalBytes += int64(nBytes)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
if errors.Cause(err) == io.EOF {
|
||||
return totalBytes, nil
|
||||
}
|
||||
return totalBytes, err
|
||||
|
||||
@@ -2,6 +2,7 @@ package io
|
||||
|
||||
import (
|
||||
"io"
|
||||
"v2ray.com/core/common/errors"
|
||||
"v2ray.com/core/common/log"
|
||||
)
|
||||
|
||||
@@ -29,7 +30,7 @@ func Pipe(reader Reader, writer Writer) error {
|
||||
|
||||
func PipeUntilEOF(reader Reader, writer Writer) error {
|
||||
err := Pipe(reader, writer)
|
||||
if err != nil && err != io.EOF {
|
||||
if err != nil && errors.Cause(err) != io.EOF {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package loader
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"reflect"
|
||||
|
||||
"github.com/golang/protobuf/proto"
|
||||
"v2ray.com/core/common/errors"
|
||||
)
|
||||
|
||||
func NewTypedSettings(message proto.Message) *TypedSettings {
|
||||
|
||||
@@ -8,26 +8,6 @@ import (
|
||||
"v2ray.com/core/common/serial"
|
||||
)
|
||||
|
||||
func InterfaceToString(value interface{}) string {
|
||||
if value == nil {
|
||||
return " "
|
||||
}
|
||||
switch value := value.(type) {
|
||||
case string:
|
||||
return value
|
||||
case *string:
|
||||
return *value
|
||||
case fmt.Stringer:
|
||||
return value.String()
|
||||
case error:
|
||||
return value.Error()
|
||||
case []byte:
|
||||
return serial.BytesToHexString(value)
|
||||
default:
|
||||
return fmt.Sprintf("%+v", value)
|
||||
}
|
||||
}
|
||||
|
||||
type LogEntry interface {
|
||||
common.Releasable
|
||||
fmt.Stringer
|
||||
@@ -46,12 +26,7 @@ func (v *ErrorLog) Release() {
|
||||
}
|
||||
|
||||
func (v *ErrorLog) String() string {
|
||||
values := make([]string, len(v.Values)+1)
|
||||
values[0] = v.Prefix
|
||||
for i, value := range v.Values {
|
||||
values[i+1] = InterfaceToString(value)
|
||||
}
|
||||
return strings.Join(values, "")
|
||||
return v.Prefix + serial.Concat(v.Values...)
|
||||
}
|
||||
|
||||
type AccessLog struct {
|
||||
@@ -68,5 +43,5 @@ func (v *AccessLog) Release() {
|
||||
}
|
||||
|
||||
func (v *AccessLog) String() string {
|
||||
return strings.Join([]string{InterfaceToString(v.From), v.Status, InterfaceToString(v.To), InterfaceToString(v.Reason)}, " ")
|
||||
return strings.Join([]string{serial.ToString(v.From), v.Status, serial.ToString(v.To), serial.ToString(v.Reason)}, " ")
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package log
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"v2ray.com/core/common/errors"
|
||||
"v2ray.com/core/common/log/internal"
|
||||
)
|
||||
|
||||
@@ -39,7 +39,7 @@ func SetLogLevel(level LogLevel) {
|
||||
func InitErrorLogger(file string) error {
|
||||
logger, err := internal.NewFileLogWriter(file)
|
||||
if err != nil {
|
||||
return errors.New("Log:Failed to create error logger on file (" + file + "): " + err.Error())
|
||||
return errors.Base(err).Message("Log: Failed to create error logger on file (", file, ")")
|
||||
}
|
||||
streamLoggerInstance = logger
|
||||
return nil
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package net
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
|
||||
"v2ray.com/core/common/errors"
|
||||
"v2ray.com/core/common/serial"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package protocol
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"v2ray.com/core/common/errors"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -3,9 +3,9 @@ package protocol
|
||||
import (
|
||||
"crypto/hmac"
|
||||
"crypto/md5"
|
||||
"errors"
|
||||
"hash"
|
||||
|
||||
"v2ray.com/core/common/errors"
|
||||
"v2ray.com/core/common/uuid"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package protocol
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"v2ray.com/core/common/errors"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -26,7 +26,7 @@ func (v *User) GetTypedAccount() (Account, error) {
|
||||
if account, ok := rawAccount.(Account); ok {
|
||||
return account, nil
|
||||
}
|
||||
return nil, errors.New("Unknown account type: " + v.Account.Type)
|
||||
return nil, errors.New("Unknown account type: ", v.Account.Type)
|
||||
}
|
||||
|
||||
func (v *User) GetSettings() UserSettings {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package retry
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"time"
|
||||
"v2ray.com/core/common/errors"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package retry_test
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"v2ray.com/core/common/errors"
|
||||
. "v2ray.com/core/common/retry"
|
||||
"v2ray.com/core/testing/assert"
|
||||
)
|
||||
|
||||
35
common/serial/string.go
Normal file
35
common/serial/string.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package serial
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func ToString(v interface{}) string {
|
||||
if v == nil {
|
||||
return " "
|
||||
}
|
||||
|
||||
switch value := v.(type) {
|
||||
case string:
|
||||
return value
|
||||
case *string:
|
||||
return *value
|
||||
case fmt.Stringer:
|
||||
return value.String()
|
||||
case error:
|
||||
return value.Error()
|
||||
case []byte:
|
||||
return BytesToHexString(value)
|
||||
default:
|
||||
return fmt.Sprintf("%+v", value)
|
||||
}
|
||||
}
|
||||
|
||||
func Concat(v ...interface{}) string {
|
||||
values := make([]string, len(v))
|
||||
for i, value := range v {
|
||||
values[i] = ToString(value)
|
||||
}
|
||||
return strings.Join(values, "")
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"crypto/md5"
|
||||
"crypto/rand"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"v2ray.com/core/common/errors"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
Reference in New Issue
Block a user