0

golang错误处理是使用return error的方式,虽然能返回错误但是没法返回错误码,比如java中的exception内有msg有error code

在golang项目如果写几个接口,接口返回值里面有error code ,但是golang 从内部函数调用中返回的error是不带code的,这就让错误码失去了意义,如果再包装一个exception结构体的话,return这个exception,但是感觉这样破坏了golang函数返回error的规则

有没有好的办法实现,没有 try catch 好麻烦

2019-07-05 提问
4 个回答
1

go 1.14 将加如try 函数,期待ing.

0

golang 的 Error 是一个 interface ,你可以用任何复杂的类做 error ,包含你需要的所有的错误信息。

只要类里面有一个 Error() String 函数就可以了。

0

可以参考下 grpc 的实现, 把 status 包装成 error. 官方仓库里有个简单的例子: https://github.com/grpc/grpc-...

0
package main

import (
    "errors"
    "fmt"
)

const (
    UnknownErrorCode = -1
)

func New(code int, text string) error {
    return &ErrorCode{code, text}
}

type ErrorCode struct {
    code int
    s    string
}

func (e *ErrorCode) Error() string {
    return e.s
}

func (e *ErrorCode) Code() int {
    return e.code
}

func ErrorToErrorCode(err error) *ErrorCode {
    if err == nil {
        return nil
    }

    errorCode, ok := err.(*ErrorCode)
    if ok {
        return errorCode
    }

    return New(UnknownErrorCode, err.Error()).(*ErrorCode)
}

func main() {
    e1 := t1()
    e2 := t2()

    ec1 := ErrorToErrorCode(e1)
    ec2 := ErrorToErrorCode(e2)
    ec3 := ErrorToErrorCode(nil)

    fmt.Println(ec1.Code(), ec1.Error())
    fmt.Println(ec2.Code(), ec2.Error())
    fmt.Println(ec3)

}

func t1() error {
    return New(100, "test1")
}

func t2() error {
    return errors.New("test2")
}

程序输出:

100 test1
-1 test2
<nil>

撰写答案

推广链接