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

C#中HttpWebRequest精准异常捕获:仅处理网络/域名解析失败

仅捕获指定WebException的解决方案

要实现仅捕获域名解析失败(Status为NameResolutionFailure的WebException),你需要精准缩小捕获范围,同时保留其他异常的调试信息,具体实现如下:

修改后的完整代码

try
{
    // 复用WebRequest对象,避免重复创建请求
    var request = WebRequest.Create("https://lon1.blynk.cloud/external/api/get?token=X&V40");
    request.Method = "GET";

    // 使用using语句自动释放资源,避免内存泄漏
    using (var response = request.GetResponse())
    using (var responseStream = response.GetResponseStream())
    using (var reader = new StreamReader(responseStream))
    {
        string responseText = reader.ReadToEnd();
        int emailrequest = Int32.Parse(responseText);

        if (emailrequest == 1 && !timer2.Enabled)
        {
            this.WindowState = FormWindowState.Maximized;
            timer2.Start();
        }
    }

    connectionerror = 0; // 连接成功,重置错误计数
    Connection_Attempt_Textbox.Text = connectionerror.ToString();
}
catch (WebException ex)
{
    // 仅处理域名解析失败的异常
    if (ex.Status == WebExceptionStatus.NameResolutionFailure)
    {
        connectionerror++;
        Connection_Attempt_Textbox.Text = connectionerror.ToString();
        connectionlost = 1;
    }
    else
    {
        // 重新抛出其他类型的WebException,保留调试信息
        throw;
    }
}
// 如需调试非WebException类型的错误,可保留此块(直接抛出不处理)
// catch (Exception ex)
// {
//     throw;
// }

关键说明

  1. 精准捕获异常类型:直接捕获WebException而非通用Exception,缩小捕获范围,避免吞掉所有错误。
  2. 基于Status判断而非消息:WebException.Status是枚举值,比异常文本消息更可靠(消息可能因系统语言本地化而变化)。
  3. 不吞掉无关异常:对于非域名解析失败的异常,用throw重新抛出,保留完整错误栈,方便调试其他问题(如Token无效、HTTP状态码错误等)。
  4. 资源管理优化:用using语句包裹WebResponse、Stream和StreamReader,确保资源自动释放,避免内存泄漏。
  5. 请求复用:只创建一次WebRequest对象,避免重复解析URL和创建请求的额外开销。

内容的提问来源于stack exchange,提问作者Anthony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:56:08