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

Интерфейс net.Error

Интерфейс net.Error представляет сетевую ошибку и расширяет стандартный интерфейс error. Он добавляет метод Timeout, который позволяет определить, является ли ошибка временной и может ли повторный запрос быть успешным. Этот интерфейс реализуется многими типами ошибок в пакете net, такими как OpError, DNSError и AddrError.

Синтаксис

type Error interface { error Timeout() bool Temporary() bool }

Интерфейс содержит три метода: Error возвращает строковое описание ошибки, Timeout сообщает, произошла ли ошибка из-за превышения времени ожидания, а Temporary указывает, является ли ошибка временной и может ли повториться.

Пример sect

Давайте проверим, является ли ошибка временной при попытке подключения к недоступному порту:

package main import ( "fmt" "net" "time" ) func main() { conn, err := net.Dial("tcp", "localhost:9999") if err != nil { if netErr, ok := err.(net.Error); ok { fmt.Println("Is timeout:", netErr.Timeout()) fmt.Println("Is temporary:", netErr.Temporary()) } fmt.Println("Error:", err) return } defer conn.Close() fmt.Println("Connected successfully") }

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

"Is timeout: false" "Is temporary: false" "Error: dial tcp 127.0.0.1:9999: connect: connection refused"

В этом примере подключение отклонено, поэтому ошибка не является временной.

Пример sect

Рассмотрим пример с установкой времени ожидания для подключения:

package main import ( "fmt" "net" "time" ) func main() { conn, err := net.DialTimeout("tcp", "192.0.2.1:80", 2*time.Second) if err != nil { if netErr, ok := err.(net.Error); ok { fmt.Println("Is timeout:", netErr.Timeout()) fmt.Println("Is temporary:", netErr.Temporary()) } fmt.Println("Error:", err) return } defer conn.Close() fmt.Println("Connected successfully") }

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

"Is timeout: true" "Is temporary: true" "Error: dial tcp 192.0.2.1:80: i/o timeout"

Здесь ошибка вызвана превышением времени ожидания, поэтому оба метода возвращают true.

Пример sect

Проверим ошибку DNS при попытке разрешить несуществующее имя хоста:

package main import ( "fmt" "net" ) func main() { ips, err := net.LookupIP("nonexistent.domain.local") if err != nil { if netErr, ok := err.(net.Error); ok { fmt.Println("Is timeout:", netErr.Timeout()) fmt.Println("Is temporary:", netErr.Temporary()) fmt.Println("Error type:", fmt.Sprintf("%T", err)) } fmt.Println("Error:", err) return } fmt.Println("IP addresses:", ips) }

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

"Is timeout: false" "Is temporary: false" "Error type: *net.DNSError" "Error: lookup nonexistent.domain.local: no such host"

Ошибка DNS не является временной и не связана с таймаутом.

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

  • тип net.OpError,
    который представляет ошибки операций ввода-вывода
  • тип net.DNSError,
    который представляет ошибки разрешения DNS
  • тип net.AddrError,
    который представляет ошибки адресации
  • функцию net.DialTimeout,
    которая выполняет подключение с таймаутом
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить