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

TIdHTTP抛出Socket Error #10054错误如何捕获并屏蔽弹窗?

TIdHTTP 捕获Socket Error 10054、禁止错误弹窗的实现方法

出现Socket Error # 10054 Connection reset by peer弹窗,一般两个原因:一是Indy组件关联的弹窗逻辑(常见是引入了TIdAntiFreeze组件默认开启异常弹窗),二是没有正确捕获对应类型的异常,导致异常冒泡到顶层被系统默认弹窗处理。

具体实现步骤

  • 提前关闭内置弹窗触发源
    如果你在工程里放置了TIdAntiFreeze组件,发起请求前将其Active属性临时设为False,请求结束后再恢复即可;没有使用该组件的话跳过这步,原生TIdHTTP默认不会主动弹出错误框。
  • 引入异常类对应的单元
    代码的uses段必须加入IdException、IdSocketError单元,否则无法精准捕获套接字异常。
  • 编写分层try...except块捕获异常
    优先捕获更细分的套接字异常,再捕获HTTP协议异常,最后做通用兜底,异常分支里写自定义处理逻辑即可,不要调用弹窗方法就不会弹出提示。

代码示例

uses
  IdHTTP, IdException, IdSocketError, IdURI;

procedure FetchUrlContent;
var
  IdHttp: TIdHTTP;
  ResContent: string;
begin
  IdHttp := TIdHTTP.Create(nil);
  try
    // 基础配置,建议设置超时避免长时间阻塞
    IdHttp.ReadTimeout := 8000;
    IdHttp.ConnectTimeout := 5000;

    // 若使用了IdAntiFreeze,临时关闭:IdAntiFreeze1.Active := False;
    try
      ResContent := IdHttp.Get('https://目标请求地址');
      // 正常处理返回内容
    except
      // 捕获套接字层异常
      on E: EIdSocketError do
      begin
        case E.LastError of
          10054:
          begin
            // 此处写连接被重置后的自定义逻辑,比如重试、记录日志,不需要就留空
          end;
          // 其他套接字错误按需处理
        end;
      end;
      // 捕获HTTP协议层异常,比如403、404、500等状态码错误
      on E: EIdHTTPProtocolException do
      begin
        // 自定义处理逻辑
      end;
      // 兜底其他异常
      on E: Exception do
      begin
        // 自定义处理逻辑
      end;
    end;
  finally
    IdHttp.Free;
    // 若之前关闭了IdAntiFreeze,在此恢复:IdAntiFreeze1.Active := True;
  end;
end;

注意:IDE调试状态下弹出的异常提示是调试器的内置中断提示,不是程序自身弹出的对话框。可以在调试器选项中关闭「Stop on Delphi Exceptions」,或者直接编译为Release版本脱离IDE运行,就不会看到该类调试提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:18:14