在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
不见了。
通过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代码以拦截该值外(例如,像在Delphi Tokyo中那样通过“重新创建” ESOAPHTTPException后代),
有没有人发现另一种检测特定错误的方法(在我的情况下为ERROR_INTERNET_TIMEOUT
)?
我有忽略吗?