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

Тип net.DNSError

Тип net.DNSError используется для представления ошибок, которые возникают при разрешении доменных имен через DNS. Он реализует интерфейс error и содержит дополнительные поля, позволяющие определить причину ошибки: имя хоста, которое не удалось разрешить, является ли ошибка временной, а также вызвана ли она неверным форматом имени. Этот тип возвращается функциями, выполняющими DNS-запросы, такими как net.LookupHost, net.LookupIP и другими.

Структура

type DNSError struct { Err string Name string Server string IsTimeout bool IsTemporary bool IsNotFound bool }

Поле Err содержит текстовое описание ошибки, Name — доменное имя, которое вызвало ошибку, Server — адрес DNS-сервера (если доступен). Поле IsTimeout указывает, была ли ошибка вызвана таймаутом, IsTemporary — является ли ошибка временной, а IsNotFound говорит о том, что запрошенное имя не найдено.

Синтаксис

var err error = &net.DNSError{ Err: "no such host", Name: "example.com", }

Обычно объект net.DNSError создается не вручную, а возвращается функциями пакета net при ошибке DNS-запроса.

Пример

Выполним разрешение несуществующего домена и обработаем ошибку как net.DNSError:

package main import ( "fmt" "net" ) func main() { ips, err := net.LookupIP("nonexistent.domain") if err != nil { if dnsErr, ok := err.(*net.DNSError); ok { fmt.Println("DNS error:", dnsErr.Err) fmt.Println("Name:", dnsErr.Name) fmt.Println("IsTimeout:", dnsErr.IsTimeout) fmt.Println("IsTemporary:", dnsErr.IsTemporary) fmt.Println("IsNotFound:", dnsErr.IsNotFound) } else { fmt.Println("Other error:", err) } return } fmt.Println("IPs:", ips) }

Результат выполнения кода (зависит от DNS-сервера):

"DNS error: no such host" "Name: nonexistent.domain" "IsTimeout: false" "IsTemporary: false" "IsNotFound: true"

В этом примере мы выполняем запрос для несуществующего домена. При возникновении ошибки мы приводим ее к типу net.DNSError и выводим все поля, чтобы понять причину.

Пример

Проверим, является ли ошибка временной, и выполним повторный запрос:

package main import ( "fmt" "net" "time" ) func main() { host := "example.com" for i := 0; i < 3; i++ { ips, err := net.LookupIP(host) if err != nil { if dnsErr, ok := err.(*net.DNSError); ok && dnsErr.IsTemporary { fmt.Printf("Temporary error, retrying (%d/3)...\n", i+1) time.Sleep(1 * time.Second) continue } fmt.Println("Fatal error:", err) return } fmt.Println("IPs:", ips) return } fmt.Println("Failed after retries") }

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

"IPs: [93.184.216.34 2606:2800:220:1:248:1893:25c8:1946]"

Здесь мы проверяем флаг IsTemporary и при его установке выполняем повторные попытки с задержкой. Если ошибка не временная, мы завершаем выполнение.

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

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