Тип net.AddrError

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

Структура типа

gotype AddrError struct {
  Err  string // описание ошибки
  Addr string // ошибочный адрес
}

Структура AddrError содержит два поля: Err с текстовым описанием проблемы и Addr с некорректным адресом, вызвавшим ошибку. Оба поля доступны для чтения и могут быть использованы для диагностики.

Метод Error

gofunc (e *AddrError) Error() string

Метод Error возвращает строковое представление ошибки, объединяя сообщение об ошибке и некорректный адрес. Это позволяет использовать тип AddrError везде, где ожидается интерфейс error.

Метод Timeout

gofunc (e *AddrError) Timeout() bool

Метод Timeout всегда возвращает false, так как ошибка адреса не связана с таймаутами. Этот метод реализует интерфейс net.Error для совместимости с другими сетевыми ошибками.

Метод Temporary

gofunc (e *AddrError) Temporary() bool

Метод Temporary всегда возвращает false, поскольку ошибка адреса обычно указывает на постоянную проблему в формате адреса, а не на временную недоступность. Данный метод реализует интерфейс net.Error.

Пример получения ошибки

Попробуем установить соединение с неверным адресом и перехватим ошибку типа AddrError:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  _, err := net.Dial("tcp", "invalid:address")
  if err != nil {
    if addrErr, ok := err.(*net.AddrError); ok {
      fmt.Printf("Error: %s\n", addrErr.Err)
      fmt.Printf("Address: %s\n", addrErr.Addr)
      fmt.Printf("Full error: %s\n", addrErr.Error())
    }
  }
}

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

goError: dial tcp: address invalid:address: missing port in address
Address: invalid:address
Full error: dial tcp: address invalid:address: missing port in address

Пример с парсингом адреса

Попробуем разобрать некорректный IP-адрес с портом и обработаем возникающую ошибку:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  host, port, err := net.SplitHostPort("192.168.1")
  if err != nil {
    if addrErr, ok := err.(*net.AddrError); ok {
      fmt.Printf("Invalid address: %s\n", addrErr.Addr)
      fmt.Printf("Reason: %s\n", addrErr.Err)
    }
  } else {
    fmt.Printf("Host: %s, Port: %s\n", host, port)
  }
}

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

goInvalid address: 192.168.1
Reason: address 192.168.1: missing port in address

Пример использования в HTTP

При работе с HTTP-клиентом неверный адрес также может привести к ошибке AddrError:

gopackage main

import (
  "fmt"
  "net"
  "net/http"
)

func main() {
  client := &http.Client{}
  _, err := client.Get("http://bad:address")
  if err != nil {
    if addrErr, ok := err.(*net.AddrError); ok {
      fmt.Printf("Address error: %s\n", addrErr.Addr)
      fmt.Printf("Description: %s\n", addrErr.Err)
    } else {
      fmt.Printf("Other error: %s\n", err)
    }
  }
}

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

goAddress error: bad:address
Description: dial tcp: address bad:address: missing port in address

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

  • тип net.Error,
    который представляет интерфейс для сетевых ошибок
  • тип net.OpError,
    который представляет ошибки сетевых операций
  • тип net.DNSError,
    который представляет ошибки DNS-запросов
  • функцию net.SplitHostPort,
    которая разделяет адрес на хост и порт