TRESTClient перехватывает разумную причину исключения, например, когда сервер недоступен - PullRequest
0 голосов
/ 28 февраля 2019

Я изо всех сил пытаюсь выяснить причину исключения, когда отправляю запрос 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;
...