РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1074 of 1593 menu

Ошибка http.ErrServerClosed

Ошибка http.ErrServerClosed возвращается методом Server.ListenAndServe и аналогичными функциями, когда сервер был корректно остановлен с помощью метода Server.Shutdown. Эта ошибка не является критической и указывает на то, что сервер завершил работу по запросу, а не из-за сбоя. При корректной остановке сервера эту ошибку следует игнорировать, так как она является ожидаемым поведением.

Синтаксис

var ErrServerClosed = errors.New("http: Server closed")

Пример

Давайте создадим HTTP-сервер и остановим его с помощью Shutdown с контекстом:

package main import ( "context" "fmt" "log" "net/http" "time" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, World!") }) server := &http.Server{ Addr: ":8080", Handler: mux, } go func() { if err := server.ListenAndServe(); err != http.ErrServerClosed { log.Fatalf("Server error: %v", err) } }() // Wait for 5 seconds then shutdown time.Sleep(5 * time.Second) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { log.Fatalf("Shutdown error: %v", err) } fmt.Println("Server gracefully stopped") }

Результат выполнения кода:

"Server gracefully stopped"

Пример

Давайте обработаем ошибку http.ErrServerClosed при запуске сервера в основной горутине:

package main import ( "context" "log" "net/http" "os" "os/signal" "time" ) func main() { server := &http.Server{ Addr: ":8080", Handler: http.DefaultServeMux, } // Handle shutdown signals idleConnsClosed := make(chan struct{}) go func() { sigint := make(chan os.Signal, 1) signal.Notify(sigint, os.Interrupt) <-sigint ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { log.Printf("Shutdown error: %v", err) } close(idleConnsClosed) }() if err := server.ListenAndServe(); err != http.ErrServerClosed { log.Fatalf("Server error: %v", err) } <-idleConnsClosed log.Println("Server stopped") }

Результат выполнения кода после отправки сигнала SIGINT:

"Server stopped"

Смотрите также

  • функцию Server.Shutdown,
    которая корректно останавливает HTTP-сервер
  • функцию Server.ListenAndServe,
    которая запускает HTTP-сервер и ожидает подключений
  • функцию Server.Close,
    которая немедленно закрывает HTTP-сервер
  • функцию ErrHandlerTimeout,
    которая возникает при превышении времени обработки запроса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить