如何获取C#中Dns.GetHostAddresses的错误码
判断主机名是否有效:用异常捕获替代错误码处理
Dns.GetHostAddresses 不会直接返回错误码,而是通过抛出异常来表示解析失败。你需要通过捕获这些异常来判断主机名是否有效,其中 SocketException 会携带具体的底层错误码。
常见异常及对应场景
ArgumentNullException:传入的主机名为nullArgumentException:主机名是空字符串,或者包含DNS不允许的无效字符SocketException:DNS解析失败(比如主机名不存在、网络不通),可以通过它的ErrorCode属性获取Windows套接字错误码(比如11001=主机未找到,11004=无对应记录)InvalidOperationException:DNS服务内部操作出错
示例代码
using System; using System.Net; using System.Net.Sockets; public class HostnameValidator { public static bool IsHostnameValid(string hostname, out string errorMessage, out int? errorCode) { errorMessage = string.Empty; errorCode = null; try { IPAddress[] addresses = Dns.GetHostAddresses(hostname); // 能走到这里说明解析成功,主机名有效 return true; } catch (ArgumentNullException) { errorMessage = "主机名不能为null"; return false; } catch (ArgumentException) { errorMessage = "主机名格式无效(空字符串或含非法字符)"; return false; } catch (SocketException ex) { errorMessage = $"DNS解析失败:{ex.Message}"; errorCode = ex.ErrorCode; // 获取具体错误码 return false; } catch (InvalidOperationException ex) { errorMessage = $"DNS服务异常:{ex.Message}"; return false; } catch (Exception ex) { errorMessage = $"未知错误:{ex.Message}"; return false; } } // 调用示例 public static void Main() { string testHost = "invalid-hostname.example"; bool isValid = IsHostnameValid(testHost, out string msg, out int? code); Console.WriteLine($"主机名 {testHost} 是否有效:{isValid}"); if (!isValid) { Console.WriteLine($"错误信息:{msg}"); if (code.HasValue) { Console.WriteLine($"错误码:{code.Value}"); } } } }
关键说明
- 如果解析成功,方法返回
true,并得到对应的IP地址数组; - 捕获
SocketException时,ErrorCode对应的是Windows系统的套接字错误码,你可以根据这个值判断具体失败原因(比如11001表示主机不存在,11004表示主机存在但无对应IP记录); - 新手注意:一定要用
try-catch包裹Dns.GetHostAddresses,否则解析失败时会直接抛出未处理异常导致程序崩溃。
内容的提问来源于stack exchange,提问作者user3033406
相关产品推荐
相关产品推荐

