-1
e.Use(func(h echo.HandlerFunc) echo.HandlerFunc {
  return func(c echo.Context) error {
    cc := c.(*CustomContext)
    return h(cc)
  }
})


e.HTTPErrorHandler = func(err error, c echo.Context) {
  cc := c.(*CustomContext)
}

我设置了自定义 HTTPErrorHandler 和 CustomContext。

我想在 HTTPErrorHandler 中使用 CustomContext。

c.Error(echo.NewHTTPError(http.StatusUnauthorized, "error"))

工作得很好。

echo.Context is *echo.context, not *CustomContext但是,访问未注册页面时出现紧急错误。

为什么访问未找到页面时出现恐慌错误?

4

1 回答 1

2

恐慌的直接原因是使用“标准”上下文调用错误处理程序。为了使您的类型断言安全,请使用二值形式:

e.HTTPErrorHandler = func(err error, c echo.Context) {
    cc, ok := c.(*CustomContext)
    if ok {
        // A CustomContext was received
    } else {
        // Something else, probably a standard context, was received
    }
}

但更一般地说,您正在做的事情(使用自定义上下文类型)可能是一个坏主意。如果您解释您要完成的工作,可能会有更好、更强大的方法来解决它。

一种明显的替代方法是使用标准 Go 上下文,通过 echo via 公开c.Request().Context()

于 2018-05-21T15:53:56.857 回答