如何从 golang 错误方法返回结构

How to return struct from golang error method

提问人:user846445 提问时间:3/13/2022 更新时间:3/15/2022 访问量:4089

问:

我正在使用 echo 框架编写一个简单的 rest api 进行路由处理。我正在尝试使用中间件维护集中式错误处理。在下面的代码中,在错误方法实现中,我想返回一个结构,以便我可以在自定义错误处理程序中使用该信息

main.go(主去)

package main
import log "github.com/sirupsen/logrus"
import "github.com/labstack/echo"
import "net/http"
import "fmt"

func main(){
e := echo.New()
e.GET("process", PostHandler)
e.HTTPErrorHandler = customHTTPErrorHandler

log.Fatal(e.Start(":3000"))
}

func PostHandler(ctx echo.Context) error{
 x:= 0;
 if x != 0 {
    return  NewTypeError(1024, "Invalid arguments")
 }
 return ctx.JSON(http.StatusOK, "message")
}

func customHTTPErrorHandler(err error, c echo.Context) {
    fmt.Println("Inside custom error")
    fmt.Println(err);
}

错误.go

package main
import "fmt"
type Error struct{
    Message string
    Internal int
}

func (e *Error)Error() string{
    fmt.Println("Hello error")
    return "error"
}

func NewTypeError( Internal int, Message string) *Error {
    fmt.Println(Internal)
    fmt.Println(Message)
    return &Error{
        
        Message,
        Internal,
       
    }
}

我希望我的输出 json 响应像这样从自定义错误中间件发送。

{
code: "1024",
message: "Invalid Arguments"
}
GO 错误处理 Goland

评论


答:

2赞 Anderson F. Viana 3/15/2022 #1

添加 到 和添加 json 标记。c.JSONcustomHTTPErrorHandlerstruct Error

// main.go

package main

import (
    "fmt"
    "net/http"

    "github.com/labstack/echo"
    log "github.com/sirupsen/logrus"
)

func main() {
    e := echo.New()
    e.GET("process", PostHandler)
    e.HTTPErrorHandler = customHTTPErrorHandler

    log.Fatal(e.Start(":3000"))
}

func PostHandler(ctx echo.Context) error {
    x := 0
    if x == 0 {
        return NewTypeError(http.StatusInternalServerError, 1024, "Invalid arguments")
    }
    return ctx.JSON(http.StatusOK, "message")
}

func customHTTPErrorHandler(err error, c echo.Context) {
    fmt.Println("Inside custom error")

    var rerr *Error

    switch e := err.(type) {
    case *Error:
        rerr = e
    case *echo.HTTPError:
        // todo: improve error conversion
        rerr = NewTypeError(e.Code, EchoHttpError, e.Error())
    default:
        rerr = NewTypeError(http.StatusInternalServerError, InternalError, e.Error())
    }

    c.JSON(rerr.Code, rerr)
}
// error.go

package main

import (
    "fmt"
)

const (
    EchoHttpError int = iota
    InternalError
)

type Error struct {
    Code     int    `json:"-"` // optional
    Message  string `json:"message"`
    Internal int    `json:"internal"`
}

func (e *Error) Error() string {
    fmt.Println("Hello error")
    return "error"
}

func NewTypeError(code int, internal int, message string) *Error {
    fmt.Println(internal)
    fmt.Println(message)
    return &Error{
        Code:     code,
        Message:  message,
        Internal: internal,
    }
}

评论

0赞 user846445 3/15/2022
Error() 方法是否仍然保持不变。它的返回类型应该是 struct right 。否则,在中间件中,我们只收到基于上述实现的字符串“错误”。
2赞 Arif Aminudin 3/15/2022 #2

您应该在参数上插入模型。 并且您应该进行变量响应,与结构相同。 如果在响应时显示代码,则应在错误结构上添加代码。

func ToErrorResponse(err model.Error) *ErrorResponse {
    errorResponse := &ErrorResponse{
        code:       err.Code,
        message: err.Message,
    }
    return errorResponse
}

和调用函数。