提问人:user846445 提问时间:3/13/2022 更新时间:3/15/2022 访问量:4089
如何从 golang 错误方法返回结构
How to return struct from golang error method
问:
我正在使用 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"
}
答:
2赞
Anderson F. Viana
3/15/2022
#1
添加 到 和添加 json 标记。c.JSON
customHTTPErrorHandler
struct 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
}
和调用函数。
评论