Как обнаружить конкретные (тайм-аут) ошибки для запросов SOAP THTTPReqResp? - PullRequest
1 голос
/ 01 июля 2019

В Delphi Tokyo 10.2.xa ESOAPHTTPException был потомком Исключения со свойством 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 ушел.

Глядя хотя бы THTTPReqResp или THTTPReqRespHelper = 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 для перехвата этого значения (например, путем «повторного создания» потомка ESOAPHTTPException, как в Delphi Tokyo), кто-нибудь видит другой способ обнаружения конкретных ошибок (в моем случае ERROR_INTERNET_TIMEOUT)?Я что-то упустил?

...