К сожалению, TIdDNSResolver
в настоящее время не использует разные типы классов исключений для разных ошибок DNS, он использует только EIdDnsResolverError
. Я открыл билет в системе отслеживания проблем Indy, чтобы возможно добавить больше классов ошибок в будущем выпуске.
Итак, чтобы различать ошибки DNS, вам нужно взглянуть на свойство Message
исключения. Сообщения о возможных ошибках хранятся в виде строк ресурсов в блоке IdResourceStringsProtocols
(около 21 строки связано с ошибками DNS). Просто обратите внимание, что некоторые из них являются отформатированными строками, поэтому простое сравнение как есть не будет работать, вам придется использовать что-то вроде TextStartsWith()
или подобное, чтобы игнорировать любые отформатированные части.
С другой стороны, тот факт, что вы вообще получаете исключение EIdDnsResolverError
, обычно означает, что вы получили ответ от DNS-сервера. Вам не нужно различать все возможные ошибки Indy DNS, чтобы знать, что DNS-сервер существует. Только несколько ошибок EIdDnsResolverError
связаны с самим соединением, таким как RSDNSTimeout
, RSTunnelConnectToMasterFailed
и т. Д., А не с содержимым сообщений DNS.
Если вы используете версию Delphi с доступным свойством Exception.InnerException
, тогда InnerException
может быть установлен на EIdConnectTimeout
или EIdConnectException
, когда TIdDNSResolver
использует TCP (только когда qtAXFR
или qtIXFR
присутствует в QueryType
) вместо UDP. Также возможно, что InnerException
может быть EIdNotEnoughData
, но это будет ошибка обмена сообщениями, а не ошибка соединения.
В вашем примере будет использоваться UDP, поэтому я думаю, что любая ошибка EIdDNSResolverError
, отличная от RSDNSTimeout
, будет указывать на наличие DNS-сервера.