Я изо всех сил пытаюсь выяснить причину исключения, когда отправляю запрос RESTRequest на сервер, недоступный на момент запроса.
Я получаю исключение, но на самом деле этоплохое исключение для работы, когда мне нужно представить диалоговое окно сообщения об ошибке пользователю и, например, отключить клиент.
Вопрос: Как я могу получить «правильное» исключение вмое приложение, детали которого «скрыты» и в итоге становятся относительно бесполезными ERESTException
?
Это не EHTTPProtocolException
, поэтому событие на клиенте или запросе не произойдет при этой ошибке
Кстати.Использование Delphi 10.2.1.
ERESTException.Message
, которое я получаю обратно, выглядит следующим образом:
Исключение: запрос REST не выполнен: ошибка при отправке данных: (12029) Соединение с сервером не может бытьустановлено
Я использую TRESTClient
, TRESTRequest
и TRESTResponse
.
Когда я выполняю запрос к автономной службе REST, она не работает (конечно,)
System.Net.HttpClient.Win
function TWinHTTPClient.DoExecuteRequest(const ARequest: THTTPRequest; var AResponse: THTTPResponse;
const AContentStream: TStream): TWinHTTPClient.TExecutionResult;
.....
// Send Request
LRes := WinHttpSendRequest(LRequest.FWRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, LDataLength, 0);
if not LRes then
begin
LastError := GetLastError; // this returns 1209
case LastError of
ERROR_WINHTTP_SECURE_FAILURE:
Exit(TExecutionResult.ServerCertificateInvalid);
ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED:
Exit(TExecutionResult.ClientCertificateNeeded);
else
raise ENetHTTPClientException.CreateResFmt(@SNetHttpClientSendError, [GetLastError, SysErrorMessage(GetLastError, GLib.Handle)]);
end;
end;
ENetHTTPClientException
поднимается и захватывается в REST.Client
procedure TCustomRESTRequest.Execute;
try
.....
except
// any kind of server/protocol error
on E: EHTTPProtocolException do
begin
FExecutionPerformance.ExecutionDone;
// we keep measuring only for protocal errors, i.e. where the server actually anwered, not for other exceptions.
LContent := E.ErrorMessage; // Full error description
//Fill RESTResponse with actual response data - error handler might want to access it
ProcessResponse(LURL, LResponseStream, LContent);
if (E.ErrorCode >= 500) and Client.RaiseExceptionOn500 then
raise ERESTException.Create(E.Message);
HandleEvent(DoHTTPProtocolError);
end;
// Unknown error, might even be on the client side. raise it!
on E: Exception do
begin
// If Execute raises an Exception, then the developer should have look into the actual BaseException
raise ERESTException.CreateFmt(sRESTRequestFailed, [E.Message]);
end;
end;