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
Например, доступ к сети обычно не требуется, так как поиск службы имен может быть полностью обработан на локальном устройстве. Поскольку сбой службы имен происходит из-за невозможности связаться с сервером имен, имеет смысл выдать другое сообщение об ошибке (и исключение), даже если основная причина одинакова для данного набора тестов. Возможно, вы не сможете связаться с серверами имен по каким-либо причинам. Опять же, вам нужно проверить сообщение из исключения, чтобы дать пользователю хорошее сообщение об ошибке.