如何检测THTTPReqResp SOAP请求的特定(超时)错误?

时间:2019-07-01 13:00:46

标签: delphi error-handling soap-client wininet delphi-10.3-rio

在Delphi Tokyo 10.2.x中,ESOAPHTTPException是Exception后代,其创建者中设置了StatusCode属性:

ESOAPHTTPException = class(Exception)
private
  FStatusCode: Integer;
public
{$IF CompilerVersion <= 15.0}
  constructor Create(const Msg: string; SCode: Integer = 0);
{$ELSE}
  constructor Create(const Msg: string; SCode: Integer = 0; Dummy: Integer = 0);
{$IFEND}
  constructor CreateFmt(const Msg: string; const Args: array of const; SCode: Integer = 0; Dummy: Integer = 0);

  property StatusCode: Integer read FStatusCode write FStatusCode;
end;

通过查看StatusCode值,我可以检测到特定的错误:

// WinINet error codes https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.serviceerror%28v=exchg.80%29.aspx
if (E is ESOAPHTTPException) and (ESOAPHTTPException(E).StatusCode = ERROR_INTERNET_TIMEOUT) then
begin

我们使用THTTPReqResp。在东京,THTTPReqResp的错误处理代码称为HandleWinInetError(GetLastError,,它测试了一些特定的错误,并测试了其他的THTTPReqResp.RaiseCheck,然后测试了raise ESOAPHTTPException.CreateFmt(',所有这些都传递了GetLastError值。这就是它最终在StatusCode属性中的原因。

但是现在在Delphi Rio 10.3.1 ESOAPHTTPException = ENetException;ENetException = class(Exception);中,不再有StatusCode。 HandleWinInetError不见了。

通过THTTPReqRespTHTTPReqRespHelper = class helper for THTTPReqResp,我看到例如THTTPReqResp.Execute引发ESOAPHTTPException

on Ex: ESOAPHTTPException do
begin
  if not CanRetry or not IsErrorStatusCode(HTTPResponse.StatusCode) then
    raise;
    ...
end;

...但是那时HTTPResponse.StatusCode丢失了(HTTPResponse是方法中的局部变量)。

除了破解Delphi代码以拦截该值外(例如,像在Delphi Tokyo中那样通过“重新创建” ESOAPHTTPException后代), 有没有人发现另一种检测特定错误的方法(在我的情况下为ERROR_INTERNET_TIMEOUT)? 我有忽略吗?​​

0 个答案:

没有答案