HashLoad / horse

Fast, opinionated, minimalist web framework for Delphi
MIT License
1.17k stars 217 forks source link

Middleware handle-exception #306

Closed ednergassen closed 1 year ago

ednergassen commented 2 years ago

Bom dia!

Estou testando o middleware handle-exception no horse. Criei um middleware para uma funcionalidade específica. Quando gero uma EHorseException no mesmo, a execução do código não é interrompida, chegando até a minha rota que eu chamei. Apenas se utilizo o EHorseCallbackInterrupted que é interrompido.

Esse comportamento é para ser dessa forma mesmo?

viniciussanchez commented 2 years ago

Sim, o EHorseCallbackInterrupted foi feito pra isso

ednergassen commented 2 years ago

Certo, mas como estou gerando uma EHorseException ele não deveria de interromper a execução do código ao invés de deixar chegar a rota que eu chamei?

viniciussanchez commented 2 years ago

As vezes a ordem dos middlewares tambem podem influenciar. Mas tipo, o EHorseException é pra você tratar uma exceção. O EHorseCallbackInterrupted é para interromper

ednergassen commented 2 years ago

Obrigado pelos retornos Vinicius.

Confesso que não entendi direito.

Me corrige se eu estiver errado. O middleware handle-exception é para ter uma padrão de retorno em formato JSON. Eu utilizo a EHorseException para tratar o meu erro e poder passar informações mais detalhadas sobre o erro gerado. Mas mesmo assim continua sendo uma exception, ou seja, deveria de interromper a execução do código e retornar o JSON com as informações.

ednergassen commented 2 years ago
 try
    Next();
  except
    on E: EHorseCallbackInterrupted do
      raise;
    on E: EHorseException do
    begin
      ...
      SendError(Res, LJSON, Integer(E.Status));
      raise EHorseCallbackInterrupted.Create; // Incluído (No original não consta)
    end;
    on E: Exception do
    begin
      ...
      SendError(Res, LJSON, LStatus);
      raise EHorseCallbackInterrupted.Create; // Incluído (No original não consta)
    end;
  end;

Não deveria de ter um raise EHorseCallbackInterrupted.Create;?

gabrielbaltazar commented 2 years ago

Não deveria lançar no EHorseCallbackInterrupted porque daí não passaria pelos demais middlewares.