1
0
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:
Darien Raymond
2016-12-04 09:10:47 +01:00
parent a4019a6900
commit efb24a4d21
65 changed files with 251 additions and 132 deletions

View File

@@ -3,7 +3,7 @@
package common
import (
"errors"
"v2ray.com/core/common/errors"
)
var (

80
common/errors/errors.go Normal file
View 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,
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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 {

View File

@@ -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)}, " ")
}

View File

@@ -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

View File

@@ -1,9 +1,9 @@
package net
import (
"errors"
"strconv"
"v2ray.com/core/common/errors"
"v2ray.com/core/common/serial"
)

View File

@@ -1,7 +1,7 @@
package protocol
import (
"errors"
"v2ray.com/core/common/errors"
)
var (

View File

@@ -3,9 +3,9 @@ package protocol
import (
"crypto/hmac"
"crypto/md5"
"errors"
"hash"
"v2ray.com/core/common/errors"
"v2ray.com/core/common/uuid"
)

View File

@@ -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 {

View File

@@ -1,8 +1,8 @@
package retry
import (
"errors"
"time"
"v2ray.com/core/common/errors"
)
var (

View File

@@ -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
View 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, "")
}

View File

@@ -5,7 +5,7 @@ import (
"crypto/md5"
"crypto/rand"
"encoding/hex"
"errors"
"v2ray.com/core/common/errors"
)
var (