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
相关产品推荐
相关产品推荐

