猿问

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

现在我有这个:


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


子衿沉夜
浏览 138回答 3
3回答

犯罪嫌疑人X

它是一个服务器,处理程序不应返回错误,因为据说您应该简单地通知客户端在处理请求时遇到了错误。判断错误类型并输出相应的http代码和可选的消息体。现在,如果碰巧你的服务器有一些其他的 goroutines 需要被通知你可以通过一个通道向他们发送错误信号(用于指标或类似的东西),所以你可以以任何你希望的方式使用错误在处理程序范围之外。

繁华开满天机

不会编译 b/c http.HandlerFunc 不会返回返回 AppError 的函数。为什么不直接在 makeUpdate 方法中处理错误?如果我使用 AppError 作为返回值,如何避免显式返回 nil?不能在返回参数中使用 'nil' 作为 AppError 类型,您可以使用初始值,如下所示:func test() AppError {&nbsp; &nbsp; ret := AppError{&nbsp; &nbsp; &nbsp; &nbsp; 200, "OK",&nbsp; &nbsp; }&nbsp; &nbsp; condition := true // some condition&nbsp; &nbsp; if !condition {&nbsp; &nbsp; &nbsp; &nbsp; ret.Status = 500&nbsp; &nbsp; &nbsp; &nbsp; ret.Message = "internal error"&nbsp; &nbsp; }&nbsp; &nbsp; return ret}

九州编程

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

相关分类

Go
我要回答