Membros Pro bnobre Postado 26 Dezembro, 2024 Membros Pro Postado 26 Dezembro, 2024 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 Juliomar Marchetti Postado 26 Dezembro, 2024 Moderadores Postado 26 Dezembro, 2024 se seu código estiver em try except de tratamento ele pode não disparar a excessão. tem um exemplo para postar como está seu projeto executando e todo o processo. Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
Moderadores BigWings Postado 26 Dezembro, 2024 Moderadores Postado 26 Dezembro, 2024 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. 1 BigWingsAjude o Projeto ACBr crescer - Assine o SAC
Membros Pro bnobre Postado 26 Dezembro, 2024 Autor Membros Pro Postado 26 Dezembro, 2024 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 BigWings Postado 26 Dezembro, 2024 Moderadores Solution Postado 26 Dezembro, 2024 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). BigWingsAjude o Projeto ACBr crescer - Assine o SAC
Membros Pro bnobre Postado 26 Dezembro, 2024 Autor Membros Pro Postado 26 Dezembro, 2024 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
Consultores Daniel InfoCotidiano Postado 27 Dezembro, 2024 Consultores Postado 27 Dezembro, 2024 Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico. Daniel de Morais (Infocotidiano) Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Discord
Recommended Posts