为了账号安全,请及时绑定邮箱和手机立即绑定

从 HandlerFunc 返回错误 - 需要一个新类型

从 HandlerFunc 返回错误 - 需要一个新类型

Go
子衿沉夜 2023-05-04 16:44:24
现在我有这个:type AppError struct{   Status int   Message string}func (h NearbyHandler) makeUpdate(v NearbyInjection) http.HandlerFunc {    return func(w http.ResponseWriter, r *http.Request) {        item, ok := v.Nearby[params["id"]]        if !ok {            return AppError{                500, "Missing item in map.",            }        }   }}问题是如果我这样做:func (h NearbyHandler) makeUpdate(v NearbyInjection) http.HandlerFunc {    return func(w http.ResponseWriter, r *http.Request) AppError { // <<< return AppError    }}不会编译 b/c http.HandlerFunc 不会返回返回 AppError 的函数。nil我的另一个问题是,如果我使用 AppError 作为返回值,如何避免显式返回?请注意,我收到此错误:不能在返回参数中使用 func 文字(类型 func(http.ResponseWriter, *http.Request) AppError)作为类型 http.HandlerFunc
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

它是一个服务器,处理程序不应返回错误,因为据说您应该简单地通知客户端在处理请求时遇到了错误。判断错误类型并输出相应的http代码和可选的消息体。

现在,如果碰巧你的服务器有一些其他的 goroutines 需要被通知你可以通过一个通道向他们发送错误信号(用于指标或类似的东西),所以你可以以任何你希望的方式使用错误在处理程序范围之外。


查看完整回答
反对 回复 2023-05-04
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

不会编译 b/c http.HandlerFunc 不会返回返回 AppError 的函数。


为什么不直接在 makeUpdate 方法中处理错误?


如果我使用 AppError 作为返回值,如何避免显式返回 nil?


不能在返回参数中使用 'nil' 作为 AppError 类型,您可以使用初始值,如下所示:


func test() AppError {

    ret := AppError{

        200, "OK",

    }


    condition := true // some condition

    if !condition {

        ret.Status = 500

        ret.Message = "internal error"

    }

    return ret

}


查看完整回答
反对 回复 2023-05-04
?
九州编程

TA贡献1785条经验 获得超4个赞

因此,go 的设计者没有返回请求的状态,而是给了您ResponseWriter。这是您与客户的主要互动。例如设置一个状态码,做WriteHeader(500)



查看完整回答
反对 回复 2023-05-04
  • 3 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信