猿问

错误处理中间件抛出运行时错误

我有这个错误处理中间件:


func Error(next http.HandlerFunc) http.Handler {


    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {


        defer func() {

            if err := recover(); err != nil {


                log.Error("Caught error in defer/recover middleware: ", err)

                originalError := err.(struct{ OriginalError error }).OriginalError


                if originalError != nil {

                    log.Error("Original error in defer/recover middleware: ", originalError)

                }


                statusCode := err.(struct{ StatusCode int }).StatusCode


                if statusCode != 0 {

                    w.WriteHeader(statusCode)

                } else {

                    w.WriteHeader(http.StatusInternalServerError)

                }


                message := err.(struct{ Message string }).Message


                if message == "" {

                    message = "Unknown error message."

                }


                json.NewEncoder(w).Encode(struct {

                    ID string

                }{

                    message,

                })

            }

        }()

        next.ServeHTTP(w, r)

    })


}


DIEA
浏览 115回答 1
1回答

跃然一笑

从错误消息来看,err对象类型runtime.errorString不是struct { OriginalError error }. 强制类型断言会产生恐慌。我认为最好在类型断言期间使用第二个返回值,以检查转换过程是否成功。if err := recover(); err != nil {    if temp, ok := err.(struct{ OriginalError error }); ok {        log.Error("Caught error in defer/recover middleware: ", err)        originalError := temp.OriginalError        if originalError != nil {            log.Error("Original error in defer/recover middleware: ", originalError)        }    }    if temp, ok := err.(struct{ StatusCode int }); ok {        statusCode := temp.StatusCode        if statusCode != 0 {            w.WriteHeader(statusCode)        } else {            w.WriteHeader(http.StatusInternalServerError)        }    }    if temp, ok := err.(struct{ Message string }); ok {        message := temp.Message        if message == "" {            message = "Unknown error message."        }        json.NewEncoder(w).Encode(struct {            ID string        }{            message,        })    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答