提供以下功能:
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方法始终返回非零错误。
有人可以为此提供一些指导吗?
答案 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)
}