You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取C#中Dns.GetHostAddresses的错误码

判断主机名是否有效:用异常捕获替代错误码处理

Dns.GetHostAddresses 不会直接返回错误码,而是通过抛出异常来表示解析失败。你需要通过捕获这些异常来判断主机名是否有效,其中 SocketException 会携带具体的底层错误码。

常见异常及对应场景

  • ArgumentNullException:传入的主机名为 null
  • ArgumentException:主机名是空字符串,或者包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:50:38