Тип net.AddrError
Тип net.AddrError представляет ошибку,
возникающую при попытке выполнения операций с сетевыми
адресами, когда указанный адрес имеет неверный формат
или не может быть обработан. Этот тип реализует
интерфейс error и содержит дополнительную
информацию об ошибке, включая сам ошибочный адрес
и сообщение с описанием проблемы. Тип полезен для
отладки сетевых приложений и обработки ошибок
парсинга адресов.
Структура типа
type AddrError struct {
Err string // описание ошибки
Addr string // ошибочный адрес
}
Структура AddrError содержит два поля:
Err с текстовым описанием проблемы
и Addr с некорректным адресом, вызвавшим
ошибку. Оба поля доступны для чтения и могут быть
использованы для диагностики.
Метод Error
func (e *AddrError) Error() string
Метод Error возвращает строковое представление
ошибки, объединяя сообщение об ошибке и некорректный
адрес. Это позволяет использовать тип AddrError
везде, где ожидается интерфейс error.
Метод Timeout
func (e *AddrError) Timeout() bool
Метод Timeout всегда возвращает false,
так как ошибка адреса не связана с таймаутами.
Этот метод реализует интерфейс net.Error
для совместимости с другими сетевыми ошибками.
Метод Temporary
func (e *AddrError) Temporary() bool
Метод Temporary всегда возвращает false,
поскольку ошибка адреса обычно указывает на постоянную
проблему в формате адреса, а не на временную
недоступность. Данный метод реализует интерфейс
net.Error.
Пример получения ошибки
Попробуем установить соединение с неверным адресом
и перехватим ошибку типа AddrError:
package 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())
}
}
}
Результат выполнения кода:
Error: dial tcp: address invalid:address: missing port in address
Address: invalid:address
Full error: dial tcp: address invalid:address: missing port in address
Пример с парсингом адреса
Попробуем разобрать некорректный IP-адрес с портом и обработаем возникающую ошибку:
package 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)
}
}
Результат выполнения кода:
Invalid address: 192.168.1
Reason: address 192.168.1: missing port in address
Пример использования в HTTP
При работе с HTTP-клиентом неверный адрес также может
привести к ошибке AddrError:
package 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)
}
}
}
Результат выполнения кода:
Address error: bad:address
Description: dial tcp: address bad:address: missing port in address
Смотрите также
-
тип
net.Error,
который представляет интерфейс для сетевых ошибок -
тип
net.OpError,
который представляет ошибки сетевых операций -
тип
net.DNSError,
который представляет ошибки DNS-запросов -
функцию
net.SplitHostPort,
которая разделяет адрес на хост и порт