В 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
)?Я что-то упустил?