http - 如果http.HandlerFunc函数内部发生panic,则不会发送给客户端http状态码

标签 http go panic

如果在http.HandlerFunc 函数内发生panic,它不会发送给客户端http 状态码。为什么会这样,如何避免?因为 javascript XMLHttpRequest 在没有接收到 http 状态码时不能正常工作。

对于 http 响应没有状态和主体内容的情况,我们如何编写 ajax 请求?

func main() {
    var counter int

    http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) {
        if counter%2 == 0 {
            counter++
            writer.Write([]byte(time.Now().String()))
        } else {
            counter++
            panic(":(")
        }
    })

    err := http.ListenAndServe(":9999", nil)
    if err != nil {
        panic(err)
    }
}

最佳答案

在这种情况下你不应该使用 panic。 panic 将导致当前运行您的处理程序函数的 go 例程退出而不向响应写入任何不是您想要的内容,而是使用 WriteHeader 方法返回错误代码:

func main() {
    var counter int

    http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) {
        if counter%2 == 0 {
            counter++
            writer.Write([]byte(time.Now().String()))
        } else {
            counter++
            writer.WriteHeader(http.StatusInternalServerError)
        }
    })

    err := http.ListenAndServe(":9999", nil)
    if err != nil {
        panic(err)
    }
}

https://golang.org/pkg/net/http/#ResponseWriter

关于http - 如果http.HandlerFunc函数内部发生panic,则不会发送给客户端http状态码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53001044/

相关文章:

Angular Http 错误状态丢失

javascript - HTTP 请求回调未执行 - 为什么?

http - Google Cloud Storage 响应不一致

file - 下载文件的最简单方法?

golang - 编码 PKCS8 私钥?

parsing - golang 使用解析标准库从电子邮件中获取域

iOS iPad panic 崩溃日志解读

mysql - go mysql 返回空值

unit-testing - 在宏上下文测试中使用 panic::catch_unwind 以解决单元测试中的 panic 问题