Ir para conteúdo
  • Cadastre-se

dev botao

Exceção acontece, mas código não é interrompido


Ver Solução Respondido por BigWings,

Recommended Posts

  • Membros Pro
Postado

Olá a todos,

Estou consumindo uma API REST usando o RestClient e demais componentes sugeridos na configurações do REST Debugger, mas reparei uma coisa bem estranha.

Quando a validade do token de acesso acaba eu recebo (conforme esperado) uma exceção "raised exception class EHTTPProtocolException with message 'HTTP/1.1 401 Unauthorized'."

O problema é que apesar da exceção aparecer em modo debug, o Delphi continua a execução do código na linha seguinte, como se nada tivesse acontecido ao invés de interromper a execução do mesmo.

A documentação desses componentes do Delphi são meio escassas, porém existe uma propriedade no RestClient chamada RaiseExceptionOn500.

https://docwiki.embarcadero.com/Libraries/Athens/en/REST.Client.TCustomRESTClient.RaiseExceptionOn500

De acordo com a documentação achei que desativando a mesma resolveria, mas nada.

Porém mesmo que resolvesse a minha dúvida continua:

Como o Delphi pode disparar uma exceção em Debug, porém não interromper o código como seria de se esperar?

Desde já agradeço a atenção de todos

  • Moderadores
Postado

O try..except está no código do próprio RestClient.

Veja o comentário do método Execute:

    /// Execute does NOT raise HTTP protocol exceptions, instead TCustomRESTClient.Response.StatusCode should be checked
    /// for desired values. In many cases a 2xx StatusCode signals "succes" - other status codes don't need to be
    /// errors though. It depends on the actual REST API.
    /// </remarks>
    procedure Execute;

Ou seja você tem que verificar o código http de retorno e tratar na sua aplicação.

  • Curtir 1
Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

  • Membros Pro
Postado
2 minutos atrás, BigWings disse:

O try..except está no código do próprio RestClient.

Veja o comentário do método Execute:

    /// Execute does NOT raise HTTP protocol exceptions, instead TCustomRESTClient.Response.StatusCode should be checked
    /// for desired values. In many cases a 2xx StatusCode signals "succes" - other status codes don't need to be
    /// errors though. It depends on the actual REST API.
    /// </remarks>
    procedure Execute;

Ou seja você tem que verificar o código http de retorno e tratar na sua aplicação.

Olá meu amigo... 

Então ele trata igual o fetch do javascript que não considera retornos diferentes de 200 como exceção.

Irei tratar manualmente conforme a sugestão, mas continuo com parte da dúvida:

Porque o Delphi gera a exceção VISUALMENTE em Debug, porém continua o código normalmente como se nada tivesse acontecido?

Desde já agradeço a atenção

  • Moderadores
  • Solution
Postado
4 minutos atrás, bnobre disse:

Porque o Delphi gera a exceção VISUALMENTE em Debug, porém continua o código normalmente como se nada tivesse acontecido?

Por causa do try..except no método Execute, como dito.

procedure TCustomRESTRequest.Execute;
[...]
begin
  [...]
      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 answered, 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
            Exception.RaiseOuterException(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
          Exception.RaiseOuterException(ERESTException.CreateFmt(sRESTRequestFailed, [E.Message]));
        end;
      end;

Sendo uma exceção do tipo EHTTPProtocolException ele faz os tratamentos, mas ignora a exceção em runtime exceto no caso da propriedade RaiseExceptionOn500 estiver ativada e o status de retorno for maior 500 ou maior.

Ele também chama o evento OnHttpProtocolError que você pode querer implementar (para logs por exemplo).

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

  • Membros Pro
Postado
2 minutos atrás, BigWings disse:

Por causa do try..except no método Execute, como dito.

procedure TCustomRESTRequest.Execute;
[...]
begin
  [...]
      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 answered, 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
            Exception.RaiseOuterException(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
          Exception.RaiseOuterException(ERESTException.CreateFmt(sRESTRequestFailed, [E.Message]));
        end;
      end;

Sendo uma exceção do tipo EHTTPProtocolException ele faz os tratamentos, mas ignora a exceção em runtime exceto no caso da propriedade RaiseExceptionOn500 estiver ativada e o status de retorno for maior 500 ou maior.

Ele também chama o evento OnHttpProtocolError que você pode querer implementar (para logs por exemplo).

Explicação perfeita meu amigo...

Um forte abraço

Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.