net / http Serve方法何时应返回错误?

时间:2019-04-18 07:46:20

标签: go

提供以下功能:

func main() {
    l := createListener(8080)
    r := ksws.CreateRouter()

    if err := http.Serve(l, r); err != nil {
        fmt.Println("An error occured.")
    }
}

我想知道为什么我应该捕捉从“ http.Serve”方法返回的“错误”? 看来这里永远不会返回错误。

但是,根据文档https://golang.org/pkg/net/http/#Serve,Serve方法始终返回非零错误。

有人可以为此提供一些指导吗?

3 个答案:

答案 0 :(得分:4)

简单的情况:端口8080已被使用时,您将报错:

listen tcp :8080: bind: address already in use

另一种情况:http.Serve调用srv.trackListener,如果go未能添加侦听器,这也可能会失败。

也:http.Serve调用l.Accept()也会失败...
所以有很多可能的情况...

go惯用的是检查任何函数返回的所有错误。

PS:进行冗余错误检查要比使程序不工作(恕我直言)更安静...

答案 1 :(得分:3)

看看源代码,它可能会使您的问题更加生动。

https://golang.org/src/net/http/server.go?s=75585:75634#L2838

// Serve always returns a non-nil error and closes l. // After Shutdown or Close, the returned error is ErrServerClosed.

因此,如果出现问题,错误总是以real error返回,或者如果由于某些原因而关闭或关闭,则返回ErrServerClosed

答案 2 :(得分:0)

在您按ctrl-c进行编码时,请注意,由于程序已结束,因此不会进行打印。您应该听信号以防止这种行为。

package main

import (
    "fmt"
    "net/http"
    "os"
    "os/signal"
    "time"
)

func main() {

    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt)

    r := http.NewServeMux()
    srv := &http.Server{
        Addr:    ":0",
        Handler: r,
    }

    go func() {
        if err := srv.ListenAndServe(); err != nil {
            fmt.Println("An error occured.")
        }
    }()
    // Block until a signal is received.
    <-c
    srv.Close()
    fmt.Println("rr")
    <-time.After(time.Second)
}