ConnectException против IOException, когда Wi-Fi отключен?

Я попытался подключиться к IP-адресу (например, http://222.222.222.222:8080/) и URL-адресу (например, http://www.website.com/), пока мой Wi-Fi отключен. Я заметил, что если у меня нет Wi-Fi, и я попытался подключиться к IP-адресу, это дает мне ConnectException ошибка. С другой стороны, если у меня нет Wi-Fi, и я попытался подключиться к URL, это дает мне IOException ошибка. Почему я получаю разные Exception для двух случаев, когда единственное различие заключается в том, что я указал IP-адрес для первого и URL-адрес для другого? Может ли кто-нибудь просветить меня об этом? Я прошу это для разъяснения.

Спасибо!

1 ответ

Решение

Вы получаете разные ошибки, потому что разные шаги терпят неудачу.

Когда вы пытаетесь подключиться к порту 80 IP-адрес, это connect(2) системный вызов, который не работает. Есть много разных причин, почему connect(2) может потерпеть неудачу; вам нужно проверить сообщение из исключения, чтобы предоставить пользователю хорошее сообщение об ошибке.

Когда вы пытаетесь подключиться к порту 80 текстового адреса, библиотеки сначала попытаются преобразовать имя хоста в IP-адрес, используя getaddrinfo(3), Разрешение имени может или не может произойти сбой в зависимости от наличия доступа к сети - если вы пытались подключиться к localhost Например, доступ к сети обычно не требуется, так как поиск службы имен может быть полностью обработан на локальном устройстве. Поскольку сбой службы имен происходит из-за невозможности связаться с сервером имен, имеет смысл выдать другое сообщение об ошибке (и исключение), даже если основная причина одинакова для данного набора тестов. Возможно, вы не сможете связаться с серверами имен по каким-либо причинам. Опять же, вам нужно проверить сообщение из исключения, чтобы дать пользователю хорошее сообщение об ошибке.

Другие вопросы по тегам